【问题标题】:BackgroundWorker_DoWork: Operation has already been completed when an Async method is calledBackgroundWorker_DoWork:调用异步方法时操作已经完成
【发布时间】:2014-07-09 23:33:59
【问题描述】:

我正在使用后台工作人员并将进度报告到进度条。 在 BackgroundWorker DoWork 事件中,我在每个方法完成时调用了几个方法。我实际上是在更新运行良好的进度值。

但是,当我在 DoWork 中调用异步方法时,在调用结束后,我正在用我想要的值更新进度值 - 但它向我抛出了一个异常,上面写着:

“操作已经完成”只有当我调用 “异步方法”。

这是我的代码:

LoginBackgroundThreadReport(20, "Requesting Token");

long _StatusCode = await RequestNewToken();

LoginBackgroundThreadReport(30, "Configuring Device");   


//LoginBackgroundThreadReport method    
private void LoginBackgroundThreadReport(int pValue, string pMessage, long pStatusCode = 0)
{
    object[] _arr = new object[2];
    _arr[0] = pMessage;
    _arr[1] = pStatusCode;
    LoginBackgroundWorker.ReportProgress(pValue, _arr);
}

此处显示“请求令牌”,但“配置设备”失败,因为我在调用异步方法后更新值 30,该方法将我的进度值自动更新为 100。

【问题讨论】:

  • 为什么需要调用RequestNewToken async?您已经在与 GUI 不同的线程上,您只需要在步骤完成后报告进度。
  • 哪个方法抛出异常?
  • RequestNewToken 是我的公共类中的一个方法,它在多个地方使用,所以我没有必要修改它,所以就以同样的方式使用它。
  • 总之终于找到了解决办法 这是我提到的链接stackoverflow.com/questions/5095183/…
  • 您实际上是否有长时间运行的 CPU 绑定工作,或者是唯一长时间运行的操作受限于 IO?如果是这样,只需删除 BGW 并直接在 UI 线程中运行代码就可以了,这要归功于异步。

标签: c# async-await backgroundworker


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 2023-04-08
    • 2013-10-23
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多