【问题标题】:C# Threading error + Backgroundworker componentC# 线程错误 + Backgroundworker 组件
【发布时间】:2012-05-16 06:46:50
【问题描述】:

当我尝试通过调度程序更新 UI 元素时,我收到一个错误,指出对象引用未设置为对象的实例。

示例代码是->

backgroundworker.DoWork += >
{
// do some work here.

// close the progressbar over here

    _progressBar.Dispatcher.Invoke(DispatcherPriority.Normal, 
                                            new Action( _progressBar.Close);
}

我收到一个错误 Object reference not set in the _progressBar.Dispatcher.Invoke 语句,我的应用程序完全挂起。

【问题讨论】:

  • "_progressBar.Close" 应该不带括号传递(如果这是您尝试调用的方法的名称)。
  • 这里打错字了。我已经更正了!
  • _progressBar 是如何定义和设置的? _progressBar 似乎为空。
  • 进度条是一个类级别的成员变量,当我调试时我可以在快速观察窗口中看到它指向一个实例,它指向一个实例:)-。在后台工作线程上调用 Dowork 后,我做了一个进度条 .showdialog ..
  • 显然它不是 UI 元素或 ProgressBar,它必须是 Window 才能具有 Close() 方法。你不会在 DoWork 中编写这样的代码,它属于 RunWorkerCompleted 事件处理程序。

标签: c# .net multithreading backgroundworker


【解决方案1】:

您确定_progressBar 的值不为空吗?也许是 null 在不同的时间点。

我会添加以下几行来检查它:

new Action(() => {
                    if (_progressBar == null){
                        if (Debugger.IsAttached){
                            Debugger.Break();
                        } else {
                            Debug.Fail("_progressbar is null!");
                        }
                     } else {
                       _progressBar.Close();
                     }
                  });

【讨论】:

  • 感谢回复,我尝试了这种方法,并将代码移至runCompleted。帮助很大,谢谢...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多