我有很多Utils類,我用於許多不同的項目,其中大多數是靜態的,通常甚至不會互相調用。我的意圖是利用新的異步/等待功能,但不重寫所有的東西,所以我的問題是:我可以添加一個新的方法爲每個現有的方法命名MethodAsync與Task.Run((()=>方法名)?用異步/等待重寫我的Utils庫的正確方法
例如:
//old code that will not be removed
static void DoSomething()
{ ... }
//new code that will be added
static async Task DoSomethingAsync()
{
//not really sure if Im supposed to use await/async here.
//isn't Task awaitable even without async??
return await Task.Run(() => DoSomething());
}
基本上在舊的代碼,我只是有一個正常的同步方法,而在新的一個我有可能即使在另一個線程運行的異步方法,如果CLR把它看成一個CPU綁定方法。
如果我正確理解,每個異步方法都按定義包含一個等待對象,它是一個Task或另一個異步方法。
這意味着,只要我可以使用異步.NET方法,我應該等待它,並將我的調用方法標記爲異步。
但是,其他任何不調用任何異步方法但需要一些時間才能完成的方法應該使用Task.Run調用進行調用。
對不對?
編輯
,所以我已閱讀全部張貼鏈接,MSDN上的最佳實踐和一些博客文章,但我仍然需要一個完整的程序來遵循新的異步編碼時/等待功能。 這是我到目前爲止:
1)具有異步替代的每個.NET方法應該使用異步替代。 (據我所知,.NET異步方法已經存在,只適用於可以異步的方法)。 2)每個使用異步方法的方法也應該做成異步。 3)每個不使用異步方法的方法(因爲沒有可用的)但仍需要一些cpu時間來執行應該通過使用Task.Run包裝它們來實現異步(我知道在這種情況下它應該是使用Task.Run的客戶端,如果他們想要的話,但因爲我只爲那些需要超過50ms執行的方法添加這些包裝器,並且仍然可以使用該方法的非異步版本,所以我仍然不明白爲什麼我不應該把這個包裝放入庫中)。
4)每一個需要非cpu-time的方法都會導致它等待其他資源(如internet,數據庫,事件等等)應該使用TaskFactory.FromAsync或TaskCompletionSource。
5)現在不推薦使用System.Threading.Tasks.Parallel.Invoke(method1,method2等)。從我讀的Task.Run已經運行併發線程,如果CLR認爲需要併發。所以看起來Task.Run已經在需要的時候使用了Parallel.Invoke。
不要那樣做。除非它們實際上是異步的,否則不要創建'* Async()'方法;永遠不要在庫中調用Task.Run()。 http://msdn.microsoft.com/en-us/magazine/jj991977.aspx – SLaks
[我應該公開同步方法的異步包裝?](http://blogs.msdn.com/b/pfxteam/archive/2012/ 04/13/10293638.aspx) – ken2k
它說'Parallel.Invoke'已被棄用?它在哪裏聲明'Task.Run'使用'Parallel.Invoke'?我認爲它導致了'ThreadPool'的使用。 – Lukazoid