gpt4 book ai didi

c# - 下面的普通 lambda 和异步 lambda 之间有什么区别吗?

转载 作者:行者123 更新时间:2023-11-30 21:37:14 28 4
gpt4 key购买 nike

假设我有一个库,适用于非基于 UI 的应用程序 (ASP.NET) 和基于 UI 的应用程序(WinForm 和 WPF)。不幸的是,我无法避免混合 IO 绑定(bind)工作和 CPU 绑定(bind)工作,但我让消费者​​通过 Task.Run 调用 DummyWorkAsync 或不基于他们的应用程序类型(非 UI或基于 UI 的应用程序)。

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) 来防止将控制返回到当前同步上下文(无论如何这对库来说都是很好的做法)。在这种情况下,在您第一次等待之后,其余部分(繁重的 CPU 工作)将在线程池线程上执行(至少使用默认调度程序),因此您不需要在第一名:

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;
}

关于c# - 下面的普通 lambda 和异步 lambda 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47398710/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com