2012-09-14 29 views
5

對於異步運行代碼(例如,使用異步/等待)我需要一個適當的任務。當然,框架中有幾種預定義的方法可以覆蓋最常見的操作,但有時我想寫自己的方法。我是C#的新手,所以很可能我做錯了,但我至少對目前的做法並不滿意。 請看下面的例子爲我在做什麼:如何正確寫入自定義任務返回方法

public async Task<bool> doHeavyWork() 
    { 
     var b1 = await this.Foo(); 
     //var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run 
     var b2 = await Task.Run(()=>Bar()); 
     return b1 & b2; 
    } 

public Task<bool> Foo() 
    { 
     return Task.Factory.StartNew(() => 
            { 
             //do a lot of work without awaiting 
             //any other Task 
             return false; 
            }); 
    } 

public bool Bar() 
    { 
     //do a lot of work without awaiting any other task 
     return false; 
    } 

總的來說,我創建和使用這樣的方法,如美孚的例子,但也含有不看整個方法邏輯的「額外」拉姆達非常漂亮的imho。另一個選擇是使用像Bar這樣的任何方法,但是我認爲這更糟糕,因爲不清楚這個方法應該運行異步(除了像BarAsync這樣的正確的方法名),Task.Factory.StartNew可能必須在程序中重複幾次。我不知道如何告訴編譯器'這個方法返回一個Task,請在調用時將它作爲一個整體包裝到Task中,這就是我想要做的。

最後我的問題:寫這種方法的最佳方法是什麼?我可以擺脫'額外'lambda(當然不添加額外的命名方法)?

編輯 由於塞維認爲有一個同步版本的方法總是有很好的理由。只有在絕對必要時才應提供異步版本(Stephen Cleary的鏈接)。

+0

''不添加額外的命名方法當然「'爲什麼拒絕作爲一個選項?創建'公共布爾酒吧'和'公共任務 BarAsync'。 – Servy

+0

我想避免開銷。如果使用同步或異步的方法是很有意義的。如果沒有,會有一個公共BarAsync和一個私人酒吧(隱藏它),在這種情況下,我沒有看到很多理由。 – marce

回答

3

如果有人想打電話Bar而不在新線程/任務中啓動它,世界會結束嗎?如果另一種方法已經存在於後臺線程中,那麼不需要開始一個新任務就可以運行那個長時間運行的代碼呢?如果該方法最終被重構爲從桌面應用上下文以及ASP或控制檯上下文中調用的類庫,該怎麼辦?在其他情況下,該方法可能只需要直接運行,而不是Task

我會說你的代碼應該看起來像Bar那樣,除非絕對必須在任何情況下都不要啓動新的Task而運行代碼。

另請注意,對於較新版本的.NET,您應該從Task.Factory.StartNew切換到Task.Run,因此代碼量應該減少(有點)。

+1

好的,明白了你的意思。所以沒有'強制這個方法成任務'功能,因爲它通常是一個壞主意:) 並感謝Task.Run提示,我不知何故錯過了它...... – marce

+3

另請參閱:[我應該公開同步方法的異步包裝? ](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx) –