12

Task Parallel Library を使用して将来実行するタスクをスケジュールする方法はありますか?

System.Threading.Timer などの .NET4 以前のメソッドを使用してこれを実行できることはわかっていますが、これを行う TPL の方法がある場合は、フレームワークの設計内に留まりたいと思います。しかし、私はそれを見つけることができません。

ありがとうございました。

4

3 に答える 3

22

この機能は、現在 .NET 4.5 に組み込まれているAsync CTPで導入されました。次のように実行すると、スレッドはブロックされませんが、将来実行される Task が返されます。

Task<MyType> new_task = Task.Delay(TimeSpan.FromMinutes(5))
                            .ContinueWith<MyType>( /*...*/ );

(古い Async リリースを使用している場合は、TaskEx代わりに静的クラスを使用してくださいTask)

于 2010-11-21T02:21:57.720 に答える
11

独自のRunDelayed関数を作成できます。これには遅延が必要であり、遅延が完了した後に実行する関数が必要です。

    public static Task<T> RunDelayed<T>(int millisecondsDelay, Func<T> func)
    {
        if(func == null)
        {
            throw new ArgumentNullException("func");
        }
        if (millisecondsDelay < 0)
        {
            throw new ArgumentOutOfRangeException("millisecondsDelay");
        }

        var taskCompletionSource = new TaskCompletionSource<T>();

        var timer = new Timer(self =>
        {
            ((Timer) self).Dispose();
            try
            {
                var result = func();
                taskCompletionSource.SetResult(result);
            }
            catch (Exception exception)
            {
                taskCompletionSource.SetException(exception);
            }
        });
        timer.Change(millisecondsDelay, millisecondsDelay);

        return taskCompletionSource.Task;
    }

次のように使用します。

    public void UseRunDelayed()
    {
        var task = RunDelayed(500, () => "Hello");
        task.ContinueWith(t => Console.WriteLine(t.Result));
    }
于 2011-07-05T11:18:20.137 に答える
2

起動時にタスクを開始するワンショット タイマーを設定します。たとえば、次のコードは、タスクを開始する前に 5 分間待機します。

TimeSpan TimeToWait = TimeSpan.FromMinutes(5);
Timer t = new Timer((s) =>
    {
        // start the task here
    }, null, TimeToWait, TimeSpan.FromMilliseconds(-1));

TimeSpan.FromMilliseconds(-1)、タイマーを定期的なタイマーではなくワンショットにします。

于 2010-11-19T22:58:23.623 に答える