如何在没有新线程或异步的情况下获得异步并等待关键字但只有Task

时间:2012-10-14 21:27:14

标签: c# .net asynchronous async-await

我想知道如何在不使用额外线程或awaitasync关键字但仅使用任务的情况下完成以下程序所做的相同事情。示例代码非常棒。在我看来,我们需要使用IO绑定操作的TaskCompletionSourceAsync版本或任何长期运行的操作。

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;
}

1 个答案:

答案 0 :(得分:5)

您可以使用asyncawait / Task进行ContinueWith非常直接的翻译。其他翻译也是可能的,例如,Task.Delay变为System.Threading.Timer

基本模式适用于执行async的任何await方法:

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;
}

正确的错误处理工作要多得多。