0

我想知道如何在不使用额外线程或关键字但仅使用任务的情况下完成以下程序所做的相同 await事情async。一个示例代码会很棒。在我看来,我们需要使用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;
}
4

1 回答 1

5

您可以使用. async_ 其他翻译也是可能的,例如,成为。awaitTaskContinueWithTask.DelaySystem.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;
}

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

于 2012-10-14T23:42:52.843 回答