是否可以在Acumatica的PXLongOperation中使用异步方法?

时间:2018-06-18 12:55:55

标签: c# asynchronous acumatica

是否可以在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本地的长操作。

1 个答案:

答案 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)的情况下工作,但是再次发出可怕的警告。