是否可以在Acumatica(6.00.1263)PXLongOperation
块内使用基于异步/等待的方法?
当我尝试这个时,我得到了这个System.InvalidOperationException
:
此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =" true" %取代。此异常也可能表示尝试调用" async void"方法,在ASP.NET请求处理中通常不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。
我的代码如下所示:
PXLongOperation.StartOperation(this, async delegate ()
{
FooProcess graph = PXGraph.CreateInstance<FooProcess>();
await graph.ImportDocumentsAsync();
});
我也尝试过:
PXLongOperation.StartOperation(this, delegate ()
{
FooProcess graph = PXGraph.CreateInstance<FooProcess>();
graph.ImportDocumentsAsync().GetAwaiter().GetResult();
});
我添加了一个有效的答案,但我希望有一个更好的方法可以做到这一点,也许是一个不同的API或重载,用于处理async / await本地的长操作。
答案 0 :(得分:0)
通过Synchronously waiting for an async operation, and why does Wait() freeze the program here阅读,我找到了一个似乎有用的变体:
PXLongOperation.StartOperation(this, delegate ()
{
FooProcess graph = PXGraph.CreateInstance<FooProcess>();
var task = Task.Run(async () =>
await graph.ImportDocumentsAsync().ConfigureAwait(false));
task.Wait();
});
我犹豫是否将此标记为已解决,因为我阅读了许多关于强制异步方法同步运行的可怕警告。
注意:它也可以在没有.ConfigureAwait(false)
的情况下工作,但是再次发出可怕的警告。