[英]Is there any difference between normal lambda and async lambda below?
假設我有一個針對非基於UI的應用程序(ASP.NET)和基於UI的應用程序(WinForm和WPF)的庫,如下所示。 不幸的是,我無法避免將IO綁定的工作和CPU綁定的工作混在一起,但是我讓使用者通過Task.Run
調用DummyWorkAsync
,或者不基於他們的應用程序類型(非UI或基於UI的應用程序)來調用DummyWorkAsync
。
class DummyService
{
public static async Task<int> DummyWorkAsync()
{
// Do some I/O first.
await Task.Delay(1000);
// Tons of work to do in here!
for (int i = 0; i != 10000000; ++i)
;
// Possibly some more I/O here.
await Task.Delay(1000);
// More work.
for (int i = 0; i != 10000000; ++i)
;
return 0;
}
}
這使基於UI的使用者可以正確地使用Task.Run
來調用服務,而ASP.NET客戶端只需按以下方式直接調用該方法。
private async void MyButton_Click(object sender, EventArgs e)
{
await Task.Run(() => DummyService.DummyWorkAsync());
}
public class Home: Controller
{
public async Task<ActionResult> IndexAsync()
{
var result = await DummyService.DummyWorkAsync();
return View(result);
}
}
我對基於UI的應用感興趣。 如果我使用有什么區別
private async void MyButton_Click(object sender, EventArgs e)
{
await Task.Run(async () => await DummyService.DummyWorkAsync());
}
而不是
private async void MyButton_Click(object sender, EventArgs e)
{
await Task.Run(() => DummyService.DummyWorkAsync());
}
?
不,沒有(重大)差異。 您基本上是在問兩者之間有什么區別
static Task<int> Something() {
return SomethingAsync();
}
和
static async Task<int> Something() {
return await SomethingAsync();
}
除了您的情況之外,還有另一個包裝任務( Task.Run
),因此在同一情況下,您可能會在同一問題的另一個問題中發現異常傳播的差異(例如,您可能會發現它們之間的差異)。
因此-只需使用
await Task.Run(() => DummyService.DummyWorkAsync());
也就是說,這樣做的原因尚不清楚。 由於您的IO排在第一位-您可以使用ConfigureAwait(false)
來防止將控制權返回到當前的同步上下文(無論如何,這對於庫是一個好習慣)。 在這種情況下,第一次等待之后(其余的大量工作)將在線程池線程上執行(至少使用默認調度程序),因此您無需首先使用Task.Run
:
public static async Task<int> DummyWorkAsync()
{
// Do some I/O first.
await Task.Delay(1000).ConfigureAwait(false);
// Tons of work to do in here!
// no problem, we are not on UI thread anyway
for (int i = 0; i != 10000000; ++i)
;
// Possibly some more I/O here.
await Task.Delay(1000).ConfigureAwait(false);
// More work.
for (int i = 0; i != 10000000; ++i)
;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.