我正在制作一个下载程序。在我的项目中有一个名为main.xaml.cs和downloader.cs的主窗口和下载器类。
主窗口中有一个自定义ListBox。我试图从downloader.cs刷新列表框项,但是应用程序给出了运行时错误。
downloader.cs中的代码:
namespace MyDownloaderApp
{
class downloader
{
/*
...
*/
private void doWork()
{
((MainWindow)System.Windows.Application.Current.MainWindow).myListBox.Items.Refresh();
}
}
}
我收到以下错误:
类型' System.InvalidOperationException'的例外情况发生在WindowsBase.dll中但未在用户代码中处理: "调用线程无法访问此对象,因为另一个线程拥有它。"
然后我尝试了类似下面代码的事件处理程序,但我得到了同样的错误。
downloader.cs:
namespace MyDownloaderApp
{
class downloader
{
public event EventHandler _myEventHandler;
/*
...
*/
private void doWork()
{
this._myEventHandler(this, new EventArgs());
}
}
}
main.xaml.cs:
namespace MyDownloaderApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private FileDownloader downloader = new FileDownloader();
public MainWindow()
{
InitializeComponent();
downloader._myEventHandler += myEventHandler;
}
/*
...
*/
private void myEventHandler(object sender, EventArgs e)
{
myListBox.Items.Refresh();
}
}
}
我该怎么办才能修复它?
答案 0 :(得分:2)
您应该使用:
this.Dispatcher.Invoke((Action)(() =>
{
...// your code refresh listbox Items
}));
请查看:The calling thread cannot access this object because a different thread owns it