【发布时间】:2024-07-31 15:15:02
【问题描述】:
有没有办法同步运行 async lambda?不允许修改 lambda 表达式,必须保持原样。
复制/粘贴示例(这是一个抽象):
var loopCnt = 1000000;
Action<List<int>> aslambda = async (l) =>
{
Thread.Sleep(100);
await Task.Run(() => { });
for (int i = 0; i < loopCnt; i++) { l.Add(i); }
};
var lst = new List<int>();
aslambda(lst); //This runs asynchronously
if (lst.Count < loopCnt-100) { ; }
解决方案:
真的接受一个的答案让我进退两难。我已经用 NuGet 包尝试了 Stephen Cleary 的解决方案 - 效果很好并且适用范围广泛,但是 dvorn 对问题的回答(因为它是制定的;))是容易得多。
dvorn 是否改变了 lambda 的签名?不是和是;)
来自 MSDN:
请注意,lambda 表达式本身没有类型,因为 通用类型系统没有“lambda”的内在概念 表达。”但是,有时非正式地讲话很方便 lambda 表达式的“类型”。在这些情况下,类型是指 到 lambda 表达式的委托类型或表达式类型 已转换。
因此,双方都收到 +1 并接受了 Stephen Cleary
的回答【问题讨论】:
-
aslmbda(lst).ToList() -> 这不会停止延迟执行并在返回给您之前强制填写列表吗?
-
aslambda(..) 的返回类型为 void。
-
aslambda(lst).Wait();?而不是Thread.Sleep(100); await Task.Run(()=>{});这没有任何意义只是使用await Task.Delay(100); -
@m.rogalski: aslambda(..) 的返回类型是无效的!不允许修改 lambda 表达式。
-
我不认为您可以跟踪异步 void 何时完成。我错了吗?
标签: c# multithreading lambda async-await