首页 > 解决方案 > 调用异步单行 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#asynchronousdelegates

解决方案


在第一个示例中,c# 会将您包装async,await在另一个任务中,因为异步方法或 lambda 对性能的影响非常小

在另一个示例中,尽管它按原样返回任务,并且取决于需要等待或消耗值来等待它的任务。

如果您不打算使用该 lambda 中的值,最好只返回任务以防止将您的任务包装在另一个任务中


推荐阅读