簡體   English   中英

下面的普通Lambda和異步Lambda之間有什么區別嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM