gpt4 book ai didi

c# - c# 中 async Func> 的 3 个调用有什么区别?

转载 作者:行者123 更新时间:2023-11-30 20:14:55 24 4
gpt4 key购买 nike

方法 WhatDifferences 中的 3 个调用之间有什么区别?

测试代码如下:

async Task WhatDifferences(Context context)
{
await ActionAsync(context, async x => await IsOddAsync(x).ConfigureAwait(false));
await ActionAsync(context, x => IsOddAsync(x));
await ActionAsync(context, IsOddAsync);
}

async Task<T> ActionAsync<T>(Context context, Func<Context, Task<T>> action)
{
return await action(context).ConfigureAwait(false);
}

async Task<bool> IsOddAsync(Context context)
{
return await Task.Run(() => context.Count++ % 2 == 1).ConfigureAwait(false);
}

class Context
{
public int Count { get; set; }
}

我正在尝试决定在我的代码库中使用哪一个,并且根据我的知识,所有 3 个行为都相同。

问题与 What's the method signature for passing an async delegate? 不同

如果我表现出更多的逻辑,你可能会知道我的担忧

async Task<T> ActionAsync<T>(Context context, Func<Context, Task<T>> action)
{
using (var transaction = new TransactionScope())
{
//do some async logic before action
var result = await action(context).ConfigureAwait(false);
//do other async validation logic after action
return result;
}
}

最佳答案

I'm trying to decide which one to use in my codebase and based on my knowledge all 3 behave the same.

在这个特定的例子中,这基本上是正确的。

这创建了一个引用 IsOddAsync 方法的委托(delegate):

await ActionAsync(context, IsOddAsync);

这个为 lambda 表达式创建了一个方法,委托(delegate)引用了编译器生成的方法:

await ActionAsync(context, x => IsOddAsync(x));

这个也是一样的,但是对于异步 lambda,所以编译器生成的方法也有一个 async 状态机:

await ActionAsync(context, async x => await IsOddAsync(x).ConfigureAwait(false));

一般来说,您的问题归结为两个问题:

  1. 我应该使用方法组而不是 lambda 吗?是的你应该。这样做没有任何缺点,而且效率更高,代码更短,对可维护性没有任何影响。
  2. 我应该省略 async/await 还是保留关键字?这个更微妙。

省略 async 在这种特殊情况下 没问题,因为 async lambda 所做的只是调用一个方法并传递其参数。在调用 IsOddAsync 之前或之后,lambda 不可能抛出异常。

但是,如果您的 lambda 更复杂 - 在将其传递给 IsOddAsync 之前对 x 执行操作,或者对结果执行操作,或者使用 using block ,那么您需要保留 async/await 关键字以获得最大的可维护性。更多信息 here .

关于c# - c# 中 async Func<Task<T>> 的 3 个调用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033749/

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