2

そのようなコードを変換する方法:

public void Do2()
{
        Console.WriteLine("Do2::Before");
        Latent(() => Console.WriteLine("Do2::After"));
}
public void Latent(Action a)
{
     registeredActions.Add(a);
}
public void TriggerActions()
{
        foreach (Action a in registeredActions)
        {
            a();
        }
}

このように使用できるようにするには:

public async void Do1()
{
        Console.WriteLine("Do1::Before");
        await Latent();
        Console.WriteLine("Do1::After");
}

Task を ThreadPool や他のスレッドで実行したり、魔法のように背後で実行したりしたくないことに注意してください。つまり、 Task が「完了」したときに自分で決定し、await Latent()の後にあるコードを呼び出します。ほとんどの場合、Do1 が呼び出されるのと同じスレッドで行われます。使用例:

Console.WriteLine("Before Do");
ts.Do2();
Console.WriteLine("After Do, before triggering actions");
// ... do some other stuff and when it is the right time to "complete pending tasks"
ts.TriggerActions();
Console.WriteLine("After triggering actions");

私はこれに対する解決策を見つけることができませんでした。すべての C# 非同期サンプルは、await client.GetStringAsync(.. または Thread.Sleep(... または Task.Delay(...) について話しています。

4

1 に答える 1

3

を使用しますTaskCompletionSource<T>

Task Latent()
{
  var tcs = new TaskCompletionSource<object>();

  ... // Apply some logic here to eventually call "tcs.TrySetResult".

  return tcs.Task;
}

これは次のように使用できます。

public async Task Do1()
{
  Console.WriteLine("Do1::Before");
  await Latent();
  Console.WriteLine("Do1::After");
}
于 2013-03-22T17:03:54.670 に答える