對於異步運行代碼(例如,使用異步/等待)我需要一個適當的任務。當然,框架中有幾種預定義的方法可以覆蓋最常見的操作,但有時我想寫自己的方法。我是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的鏈接)。
''不添加額外的命名方法當然「'爲什麼拒絕作爲一個選項?創建'公共布爾酒吧'和'公共任務 BarAsync'。 –
Servy
我想避免開銷。如果使用同步或異步的方法是很有意義的。如果沒有,會有一個公共BarAsync和一個私人酒吧(隱藏它),在這種情況下,我沒有看到很多理由。 – marce