2011-01-25 87 views
1

使用的await我有這樣的事情:非CPU密集型任務

private void DoSomething() 
{ 
    System.Console.WriteLine("Creating Foo"); 
    Foo result = new Foo(); 

    DoSomethingAsync(); 

    System.Console.WriteLine("Returning Foo"); 
    return result; 
} 


private async void DoSomethingAsync() 
{ 
    // The following task takes a long time, but is not CPU intensive 
    await TaskEx.Run(() => 
    { 
     // code lives here... removed for this example 
    }); 
} 

因爲我沒有太多打CPU,我並不需要一個線程。我可以使用什麼而不是Run來避免創建線程?

+0

我可能是完全錯誤的,但是如果你想做一些異步的事情,你必須有一個單獨的線程來完成異步工作。如果將它保留在同一個線程上,則它會阻塞,因此是同步的。 – 2011-01-25 23:44:45

+0

我對異步庫的理解是,它使用windows消息泵創建回調並管理代碼執行,以便在不實際使用線程的情況下提供線程外觀(異步執行)。也就是說,除非您使用任務的「運行」方法,此時您將獲得一個線程。運行僅建議用於CPU密集型操作。 Anders Hejlsberg給出的PDC 2010演講很好地解釋了這一點: http://bit.ly/bBGOfV – mbursill 2011-01-25 23:51:12

回答

1

我想你在這裏誤解了任務異步模式的意圖。你在做什麼可能會更好地處理ThreadPool.QueueUserWorkItem這將重用進程的池中的工作線程,只有在必要時創建一個。

TAP允許您將任務分解爲可以逐步處理的「大塊」工作,但它不直接提供表達「這是後臺任務」的方法。

0

這取決於你正在做的任務。既然你說它沒有使用大量的CPU,我會認爲這個任務需要很長時間,因爲它正在等待其他事件。因此,您需要設計任務來爲這些事件註冊回調,其中每個回調在主線程上快速完成,但直到您實際等待的事件發生時纔會觸發回調。

相關問題