【问题标题】:Background worker cannot access object后台工作人员无法访问对象
【发布时间】:2012-08-22 04:07:13
【问题描述】:

我有以下设置:

BackgroundWorker backgroundInstancesWorker = new BackgroundWorker();
backgroundInstancesWorker.DoWork += new DoWorkEventHandler(EnumerateInstances);
backgroundInstancesWorker.WorkerReportsProgress = false;
backgroundInstancesWorker.WorkerSupportsCancellation = false;
backgroundInstancesWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundInstancesWorker_RunWorkerCompleted);

// Create temporary tuple to hold the argument information
// X is type IEnumerable<Foo>, Y is type Bar
object arguments = new object[2] { X, Y };
backgroundInstancesWorker.RunWorkerAsync(arguments);

线程工作者函数:

private static void EnumerateInstances(object sender, DoWorkEventArgs e)
{
     object[] arguments = e.Argument as object[];
     var queryCounterSets = arguments[0] as IEnumerable<Foo>;
     var sourceItem = arguments[1] as Bar;
     e.Result = sourceItem;
}

终于完成的功能:

private static void backgroundInstancesWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      if (e.Result != null && e.Result is Bar)
      {
          // Do stuff
      }
}

但是,在 RunWorkerCompleted 函数中,当我尝试访问 e.Result 对象时,它给了我 TargetInvocationException 并说调用线程无权访问该对象,因为另一个线程拥有它。任何人都对为什么这是一个问题有任何见解?我只是想在后台线程完成后将 Bar 对象传递给 RunWorkerCompleted。

谢谢。

【问题讨论】:

    标签: wpf multithreading backgroundworker


    【解决方案1】:

    您的 RunWorkerCompleted 事件处理程序应始终在访问 RunWorkerCompletedEventArgs.Result 属性之前检查 AsyncCompletedEventArgs.ErrorAsyncCompletedEventArgs.Cancelled 属性。如果引发异常或操作被取消,则访问 RunWorkerCompletedEventArgs.Result 属性会引发异常。

    错误可能发生在您的后台函数中。有关处理线程仿射对象的跨线程访问的一些信息,请参阅this question

    【讨论】:

    • TargetInvocationException 来自我的 DoWork。我使用 Dispatcher 修复了它。谢谢!。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多