2011-05-26 58 views
3

我有以下情形:
当命令被输入(用于测试,这是一个控制台应用程序,当它准备好了,我希望这将是一个WebService)我执行一些代码,并且需要进一步的用户输入的时候,我立即返回到命令解释器。当新的输入被给出时,我想要处理从我离开它的地方恢复。这听起来很像C#5异步等待模式,我决定尝试一下。 我在想这个问题:如何编写C#5异步?

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,以及如何从第二个任务中发出准备好信号?我已经尝试了许多工厂方法的任务,但我找不到合适的!请帮忙!

+0

它与您的问题没有直接关系,但您如何拥有c#5? – soandos 2011-05-26 21:35:45

+1

我想要使用异步CTP:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d7ccfefa-123a-40e5-8ed5-8d2edd68acf4&displaylang=en – TDaver 2011-05-26 21:43:10

+0

谢谢你的链接。 – soandos 2011-05-26 21:48:59

回答

6

一种选择是使用TaskCompletionSource<T>。这将为您创建一项任务,您可以在源上调用SetResultSetException,这将适当地指示任务。

这就是我用来implement AsyncTaskMethodBuilder<T> for Eduasync - 所以你可以看一下,对于一个例子。

你需要或者建立TaskCompletionSource事前或执行一些其他的协调,以便​​和UseThis都知道同一个对象 - 但随后Calculate将只返回completionSource.Task,并且UseThis会打电话completionSource.SetResult

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

+0

谢谢,它看起来很有希望。我会尝试实现我的实际代码,然后检查接受。 – TDaver 2011-05-26 21:34:38

+0

尽管问题很快,我已经安装了CTP,但是看起来似乎没有编译。我究竟做错了什么? – TDaver 2011-05-26 21:52:05

+0

@TDaver:你得到什么错误?如果CTP安装干净,编译器应该已经适当地更改了...... – 2011-05-27 05:25:28