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

有没有办法同步运行异步lambda? 不允许修改lambda表达式,它必须按原样保留。

复制/粘贴示例(这是一个抽象):

var loopCnt = 1000000; Action<List> aslambda = async (l) => { Thread.Sleep(100); await Task.Run(() => { }); for (int i = 0; i < loopCnt; i++) { l.Add(i); } }; var lst = new List(); aslambda(lst); //This runs asynchronously if (lst.Count < loopCnt-100) { ; } 

解:

接受一个答案对我来说真是一个两难的选择。 我已经尝试过使用NuGet软件包的Stephen Cleary的解决方案 – 工作精彩且广泛适用,但是dvorn对问题(因为它的制定;))的回答要容易得多。

dvorn改变了lambda的签名吗? 不,是的;)

来自MSDN:

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

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

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

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

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

 AsyncContext.Run(() => aslambda(lst)); 

更好的解决方案:您无法更改lambda,但您可以更改分配给它的局部变量的类型。 请注意,异步lambda的本机类型不是Action而是Func

 ... Func, Task> aslambda = async (l) => ... ... aslambda(lst).Wait(); ...