有没有办法同步运行异步lambda?

Rek*_*ino 7 c# lambda multithreading async-await

有没有办法同步运行异步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) { ; }
Run Code Online (Sandbox Code Playgroud)

解:

这是真的左右为难我很乐意接受一个答案.我已经尝试过使用NuGet软件包的Stephen Cleary的解决方案- 工作精彩且广泛适用,但dvorn对问题(因为它的公式化)的回答要容易得多.

已经dvorn改变拉姆达的签名?不,是的;)

来自MSDN:

请注意,lambda表达式本身没有类型,因为公共类型系统没有"lambda表达式"的内在概念.然而,有时非常方便地谈论lambda表达式的"类型".在这些情况下,类型引用lambda表达式转换为的委托类型或表达式类型.

所以两人都获得了Stephen Cleary的+1和接受的回答

Ste*_*ary 5

有没有办法同步运行async [void] lambda?

是的,但是像所有同步异步黑客一样,它很危险,并不适用于所有lambdas.

您必须有一个自定义SynchronizationContext来检测async void方法(或lambda)的完成.这是非常重要的,但您可以使用我的AsyncContext(在NuGet包中提供Nito.AsyncEx.Context):

AsyncContext.Run(() => aslambda(lst));
Run Code Online (Sandbox Code Playgroud)

  • 这就是我在等的人。打算自己试试这个。 (2认同)