2011-05-26 82 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