不同STA线程

时间:2017-01-25 17:32:54

标签: c# wpf multithreading dispatcher sta

当我的主窗口渲染时,我需要创建加载gif的窗口。我已经阅读了一些文章并做出决定,为此我需要创建新的线程。我在this article

中做到了

结果我有类似的东西:

LoadingDialog _loadingDlg;
Thread loadingThread;

public void ShowLoading()
{
    loadingThread = new Thread(new ThreadStart(loadingThreadWork));
    loadingThread.SetApartmentState(ApartmentState.STA);
    loadingThread.Start();
}

private void loadingThreadWork()
{
    _loadingDlg = new LoadingDialog();
    _loadingDlg.Show();
    System.Windows.Threading.Dispatcher.Run();
}

public void HideLoading()
{
    _loadingDlg.Dispatcher.InvokeShutdown();
}

第一次拨打ShowLoading()然后HideLoading()时,一切都按照我的意愿行事。但是当我第二次打电话给ShowLoading()时,我会在

处得到一个例外
_loadingDlg.Show();

包含消息The calling thread cannot access this object because a different thread owns it

这怎么可能? _loadingDlg是在上一行中创建的,并且在同一个帖子中。

1 个答案:

答案 0 :(得分:0)

在您创建控件的loadingThreadWork中,在第一次运行之前它是null,所以在您第一次成功时。但是,您在另一个线程中创建对话框,该线程被标记为控件的所有者。

在您下次调用loadingThreadWork时,控件不为空,并且ant会从另一个线程更改它(并且它是一个不同的线程,因为您'重新创建它会导致你获得的例外。

如你'再使用WPF,则或许应该从线程切换到async操作,这是更可读,可支持的和可预测的比当前解决方案