私は非同期操作が別のサーバーに依存しており、完了までにほとんどの時間がかかりません。非同期操作が実行されている間に、「メインスレッド」で処理が進行しており、完了までにはランダムな時間がかかります。非同期レイジータイムアウトタスク
メインスレッドは非同期タスクを開始し、プライマリタスクを実行し、最後に非同期タスクの結果をチェックします。
非同期スレッドはデータをプルし、メインスレッドが完了するのに重要ではないフィールドを計算します。しかし、このデータは、がメインスレッドのを遅くすることなく、計算が完了できる場合には持っているといいです(含まれているはずです)。
私はセットアップに2秒間最低で実行する非同期タスクをたいと思いますが、 は開始とメインタスクの端部との間で利用可能なすべての時間を取ること。 2つ目のランタイムを超えた場合にタイムアウトするだけで、結果が実際に要求されているという点で「遅延タイムアウト」です。非同期タスクが実行する機会があった場合:
EDIT(要件を明確化しようとしているが)(非同期 タスクが2秒の大きい、または メインタスクの合計実行時間を取る必要があります) 2秒間、メインスレッドをまったくブロックすべきではありません。メインスレッドでは、非同期タスクを実行するには少なくとも2秒かかることが必要です。さらに、メインスレッドが完了するのに2秒以上かかる場合、非同期タスクはメインスレッドと同じ長さで実行する必要があります。
私は動作するラッパーを考案しましたが、私は実際にタスクタイプのソリューションを好むでしょう。以下のラッパーソリューションを参照してください。
public class LazyTimeoutTaskWrapper<tResult>
{
private int _timeout;
private DateTime _startTime;
private Task<tResult> _task;
private IEnumerable<Action> _timeoutActions;
public LazyTimeoutTaskWrapper(Task<tResult> theTask, int timeoutInMillis, System.DateTime whenStarted, IEnumerable<Action> onTimeouts)
{
this._task = theTask;
this._timeout = timeoutInMillis;
this._startTime = whenStarted;
this._timeoutActions = onTimeouts;
}
private void onTimeout()
{
foreach (var timeoutAction in _timeoutActions)
{
timeoutAction();
}
}
public tResult Result
{
get
{
var dif = this._timeout - (int)System.DateTime.Now.Subtract(this._startTime).TotalMilliseconds;
if (_task.IsCompleted ||
(dif > 0 && _task.Wait(dif)))
{
return _task.Result;
}
else
{
onTimeout();
throw new TimeoutException("Timeout Waiting For Task To Complete");
}
}
}
public LazyTimeoutTaskWrapper<tNewResult> ContinueWith<tNewResult>(Func<Task<tResult>, tNewResult> continuation, params Action[] onTimeouts)
{
var result = new LazyTimeoutTaskWrapper<tNewResult>(this._task.ContinueWith(continuation), this._timeout, this._startTime, this._timeoutActions.Concat(onTimeouts));
result._startTime = this._startTime;
return result;
}
}
このラッパーよりも優れたソリューションはありますか?
バックグラウンドタスクの実際の作業に要する時間よりも長い時間がかかることがあるのはなぜですか? –
実際の作業よりも時間がかかることはありません。メインスレッドはたった2秒待つだけですが、メインスレッドはすぐに結果を必要とするほどビジー状態であれば、2秒以上実行することを許可します。メインスレッドが完了するまでに2秒以上かかる場合、メインスレッドはまったく待機したくありません。 – hannasm