1

void を返すアクションがあります。しかし、実行中に現在のスコープを開いたままにするための呼び出しが必要です。

    public class CancellationHelper
{
    CancellationTokenSource _cts;

    public void Run(Action<CancellationToken> action)
    {
        if (_cts != null)
        {
            return;
        }
        using (_cts = new CancellationTokenSource())
        {
            action(_cts.Token);
        }
    }
}

アクションが の場合、async_ctsメソッドが完了する前に破棄されます。戻り値の型が無効なので、ただ待つことはできません... Task.Runasync/await を避けて優先することになっていると読みましたが、句を使用するためにこれを行う方法がわかりません。

await Task.Run(action);汚れていますか?これは別の「タスク」またはスレッドをスピンアップして、タスクまたはスレッドをスピンアップする何かを待機していますか?

4

1 に答える 1

3

方法のようactionですねasync void
それをしないでください。メソッド
がいつ終了するかを知ることは不可能です。async void

代わりに、メソッドにを受け入れるようにする必要がありますFunc<Task>
その後、を書くことができますawait action();

于 2012-11-21T19:14:32.937 に答える