c# - 调用异步单行 lambda 委托
问题描述
首先,我以这种方式使用异步委托:
public async Task TestWithAsyncDelegate()
{
await MethodWithAsyncDelegate(async (counter) => await AsyncLoad(counter));
}
但是一段时间后,我发现如果使用的委托只包含一个调用,则可以简化为:
public async Task TestWithoutAsyncDelegate()
{
await MethodWithAsyncDelegate(counter => AsyncLoad(counter));
}
这段代码等效吗?在这种情况下,将 lambda 嵌入另一个委托中,我认为这是多余的。所以我正在使用它。
有人解释为什么吗?
如果调用的 lambda 必须在其主体中等待,则无法使用此方法:
public async Task TestWithMultipleCalls()
{
await MethodWithAsyncDelegate(async (counter) =>
{
await Task.Delay(10);
await AsyncLoad(counter);
});
}
完整代码如下:
public class AsyncDelegateTests
{
[Fact]
public async Task TestWithAsyncDelegate()
{
await MethodWithAsyncDelegate(async (counter) => await AsyncLoad(counter));
}
[Fact]
public async Task TestWithoutAsyncDelegate()
{
await MethodWithAsyncDelegate(counter => AsyncLoad(counter));
}
[Fact]
public async Task TestWithMultipleCalls()
{
await MethodWithAsyncDelegate(async (counter) =>
{
await Task.Delay(10);
await AsyncLoad(counter);
});
}
/// <summary>
/// simulate async work
/// </summary>
private async Task AsyncLoad(int counter)
{
await Task.Delay(10);
}
private async Task MethodWithAsyncDelegate(Func<int, Task> asyncDelegate)
{
for (int i = 0; i < 10 ; i++)
{
await asyncDelegate(i);
}
}
}
解决方案
在第一个示例中,c# 会将您包装async,await
在另一个任务中,因为异步方法或 lambda 对性能的影响非常小
在另一个示例中,尽管它按原样返回任务,并且取决于需要等待或消耗值来等待它的任务。
如果您不打算使用该 lambda 中的值,最好只返回任务以防止将您的任务包装在另一个任务中
推荐阅读
- excel - 关闭 Excel 文件时出现 VBA 运行时错误?
- c - 我旋转双向链表的逻辑有什么问题?
- lua - lua如何在表中获取表使用变量值而不是变量作为索引?TTS
- amazon-dynamodb - 使用 FilterExpression(contains) 的 aws sdk dynamodb 扫描操作导致空项目
- python-3.x - 如何在 altair 中将自定义颜色主题设置为默认值?
- excel - vba 匹配并设置它旁边的列的值
- kubernetes - 如何访问卡夫卡桥
- android - 如何访问 `ContentCaptureManager` 数据?
- c# - 无法从 blazor 组件调用 javascript 函数
- r - 根据 R 中的值和 NA 过滤“POSIXct”“POSIXt”列