【问题标题】:How to write C# 5 async?如何编写 C# 5 异步?
【发布时间】:2011-09-02 23:12:42
【问题描述】:

我有以下情况:
当输入命令时(为了测试,它是一个控制台应用程序,当它准备好时,我希望它是一个 WebService)我执行一些代码,当需要进一步的用户输入时,我立即返回命令解释器。当给出新的输入时,我希望处理从我离开的地方恢复。这听起来很像 c#5 async-await 模式,所以我决定试一试。 我在想这个:

public void CommandParser()
{
   while(true)
   { 
      string s = Console.ReadLine();
      if (s == "do_something")
         Execute();
      else if (s == "give_parameters")
         SetParameters();
      //... 
   }
}
MySettings input;
public async void Execute()
{
  //do stuff here
  MyResult result = null
  if (/*input needed*/){
     input = new MySetting();
     result = await input.Calculate();
  }
  else { /* fill result synchronously*/}
  //do something with result here

}

public void SetParameters()
{
   if (input!=null)
      input.UseThis("something"); //now it can return from await
}

现在我的问题是,如何编写 MySettings.Calculate 和 MySettings.UseThis?如何从第一个返回任务以及如何从第二个发出准备就绪信号?我已经为 Task 尝试了许多工厂方法,但我找不到合适的方法!请帮忙!

【问题讨论】:

标签: c# asynchronous async-await c#-5.0


【解决方案1】:

一种选择是使用TaskCompletionSource<T>。这将为您构建一个任务,您可以在源上调用SetResultSetException,这将适当地发出任务信号。

这就是我以前使用的implement AsyncTaskMethodBuilder<T> for Eduasync - 所以你可以看看这个例子。

您需要预先设置TaskCompletionSource 或执行一些其他协调,以便input.CalculateUseThis 都知道同一个对象 - 但随后Calculate 将只返回completionSource.Task,并且UseThis 会调用 completionSource.SetResult

请记住,当您调用 SetResult 时,如果您使用的是控制台应用程序(或 Web 服务),异步方法将继续在不同的线程池线程上运行 - 所以您无疑想要创建不同 TaskCompletionSource 用于主循环,然后用于下一轮。

【讨论】:

  • 谢谢,它看起来很有希望。我将尝试实现我的实际代码,然后检查是否接受。
  • 虽然是快速的问题,我已经安装了 CTP,但 await 似乎无法编译。我做错了什么?
  • @TDaver:你遇到了什么错误?如果 CTP 安装干净,编译器应该已适当更改...
  • 从那以后我发现我的问题是我安装了一些 post-sp1 更新,它阻止了异步 ctp。我的问题是我不知道那是什么更新,所以现在我正在卸载我能找到的所有 .net 和 vs 更新......
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 2021-12-19
  • 2021-02-06
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多