TDa*_*ver 3 c# asynchronous async-await c#-5.0
我有以下场景:
当输入命令时(为了测试,它是一个控制台应用程序,当它准备就绪时,我希望它将是一个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
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如何编写MySettings.Calculate和MySettings.UseThis?如何从第一个返回任务以及如何从第二个发出准备信号?我已尝试过许多工厂方法的Task,但我找不到合适的方法!请帮忙!
一种选择是使用TaskCompletionSource<T>.这将为您构建一个任务,您可以调用SetResult或SetException在源上,这将适当地发出任务信号.
这就是我过去为Eduasync 实现AsyncTaskMethodBuilder<T>的 - 所以你可以看一下这个例子.
你需要可以设立TaskCompletionSource事前或执行,使其他一些协调input.Calculate和UseThis都知道同一个对象-但随后Calculate将只返回completionSource.Task,并UseThis会打电话completionSource.SetResult.
请记住,当您调用时SetResult,如果您正在使用控制台应用程序(或Web服务),则异步方法将继续使用不同的线程池线程 - 因此您无疑要为主循环创建不同 TaskCompletionSource的然后用于下一轮.
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |