【问题标题】:Is it possible to use async methods inside Acumatica's PXLongOperation?是否可以在 Acumatica 的 PXLongOperation 中使用异步方法?
【发布时间】:2018-06-18 12:55:54
【问题描述】:

是否可以在 Acumatica(6.00.1263) PXLongOperation 块内使用基于 async/await 的方法?

当我尝试这个时,我得到了这个System.InvalidOperationException

此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保将页面标记为 。此异常还可能表示尝试调用“async void”方法,在 ASP.NET 请求处理中通常不支持该方法。相反,异步方法应该返回一个任务,调用者应该等待它。

我的代码如下所示:

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 或用于本地处理异步/等待的长操作的重载。

【问题讨论】:

    标签: c# asynchronous acumatica


    【解决方案1】:

    通读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) 的情况下它也可以工作,但同样是可怕的警告。

    【讨论】:

    • PXLongOperation 已经在它自己的线程中运行。在那个长操作线程中运行异步方法没有任何优势。在同步任务中运行异步方法是正确的解决方案。反指示不适用,因为您已经在异步线程中执行异步方法(长操作)。
    • ConfigureAwait 确实没有必要。
    • @HuguesBeauséjour 在这里使用异步的一个好处是,如果您需要在长时间运行的进程中使用异步库,例如 HttpClient、Azure Blob 存储。
    • @pettys 它将允许您以非异步方式使用异步库。理想情况下,您将使用非异步方法,因为同步运行异步代码没有任何优势。鉴于库没有同步选项,这确实是一个可以接受的解决方案。
    • @HuguesBeauséjour 谢谢你。原始发布者的问题仍然存在:如果您需要在 PXLongOperation 中使用仅具有异步方法的库,您知道在不冒重入死锁或线程耗尽风险的情况下最安全的方法是什么吗?答案的方法是我现在要采用的方法,但是很高兴看到一些 acumatica 指导,因为在同步空间中创建了一个异步范围......过去我一直被这个空间中奇怪且不可预测的错误所困扰.
    猜你喜欢
    • 2022-01-17
    • 2016-07-01
    • 2012-09-06
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多