2014-02-22 38 views
2

我一直在試圖找到一個相當長時間的解決方案,這將告訴我如何創建不使用現有異步代碼的異步方法。 IE someClass.ActionAsync() 我基本上一直想這樣做如何使用異步創建您自己的異步方法並等待

public function string GetParsedData(string code){ 
    Console.WriteLine("Starting parser"); 
    var result = ""; 
    foreach(var x in code.Split('\n')){ 
      result += Encode(x); 
    } 

    return result; 

} 

所以,我明白我必須返回一個任務,但我已經找到了如何等待lambda表達式或任何其他建議沒有信息如何打破這一點。奇怪的是,我認爲我從更尖銳的給了我日期的建議,我會在下面發表。

回答

1

所以Resharper建議我使用TaskEx.Run(已棄用),正確答案似乎是Task.Run。我發現成功改寫方法,這樣,

public function Task<string> GetParsedData(string code){ 
    Console.WriteLine("Starting parser"); 
    var taskResult = await Task.Run(() => 
    { 
     var result = ""; 
     foreach(var x in code.Split('\n')) 
     { 
      result += Encode(x); 
     } 

     return result; 
    }); 
    return taskResult; 
} 

現在我可以使用關鍵字等待此方法的其他異步方法中需要。

+3

這實際上是一個流行的反模式:[我應該公開同步方法的異步包裝?](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx) – Noseratio

+0

@Noseratio和其他人,對於異步等待和異步編程通常還是很新穎的,所以你的反應非常感謝。我能體會到碰到金錘規則的危險。我的問題最初是試圖在後臺(不阻塞)在Android上初始化SQLite數據庫。數據庫類會有一個標誌,指示它是否被卸載,加載或加載,這會阻止應用程序在加載或卸載時嘗試從它讀取數據。不確定這種模式的情況是否稍好一些。 –

+1

克里斯托弗,你可能想把它作爲一個單獨的問題發佈。理想情況下,你應該使用自然的異步SQL API,而不是用'Task.Run'包裝同步的。更多信息:http://blogs.msdn.com/b/adonet/archive/2012/04/20/using-sqldatareader-s-new-async-methods-in-net-4-5-beta.aspx – Noseratio