0

以下のプログラムが行うのと同じことを、余分なスレッドや awaitandasyncキーワードを使用せずに、タスクのみを使用して達成する方法を知りたいです。サンプルコードは素晴らしいでしょう。IO バウンド操作または長時間実行操作のバージョンTaskCompletionSourceを使用する必要があるように思えます。Async

static void Main(string[] args)
{
  Task t = Go();
  Console.WriteLine("Hello World");
  Task.Delay(1000).GetAwaiter().OnCompleted(() => { Console.WriteLine("Completed"); });
  Console.ReadLine();
}

static async Task Go()
{
  var task = PrintAnswerToLife();
  await task;
  Console.WriteLine("Done");
}

static async Task PrintAnswerToLife()
{
  var task = GetAnswerToLife();
  int answer = await task;
  Console.WriteLine(answer);
}

static async Task<int> GetAnswerToLife()
{
  var task = Task.Delay(2000);
  await task;
  int answer = 21 * 2;
  return answer;
}
4

1 に答える 1

5

を使用してasync/awaitをかなり簡単に変換できます。他の翻訳も可能です。TaskContinueWithTask.DelaySystem.Threading.Timer

基本的なパターンは次asyncawaitとおりです。

static async Task Go()
{
  var task = PrintAnswerToLife();
  await task;
  Console.WriteLine("Done");
}

になります:

static Task Go()
{
  var tcs = new TaskCompletionSource<object>();
  var task = PrintAnswerToLife();
  task.ContinueWith(_ =>
  {
    Console.WriteLine("Done");
    tcs.SetResult(null);
  });
  return tcs.Task;
}

正しいエラー処理は、より多くの作業です。

于 2012-10-14T23:42:52.843 に答える