c# - BackgroundWorker 线程必须是 STA

标签 c# wpf

我有一个 BackgroundWorker 调用函数在 BackgroundWorker _DoWork 做一个长进程,当函数发生错误时我会提示一个自定义的消息框:

 WPFMessageBoxResult result = WPFMessageBox.Show("Activation Fail", "Error!!", WPFMessageBoxButtons.OK, WPFMessageBoxImage.Error);

下面的异常发生在 WPFMessageBoxResult 类:

The calling thread must be STA, because many UI components require this. 

谢谢。

最佳答案

您不应尝试从后台线程与任何 UI 组件进行交互。

一种方法是在您的 doWork 方法中捕获异常并将其分配给 backgroundworker 的 result 属性,然后检查该结果是否是一种异常类型,如果您没有将结果用于其他任何事情,则检查该结果是否为 null。然后在 backgroundWorker_completed 事件中检查它。

BackgroundWorker_DoWork(sender, )
{
    try
    {
       // do work        
    }
    catch (Exception ex)
    {
         BackgroundWorker w = sender as BackgroundWorker;
         if (w != null)
             w.Result = ex;
    }
}

然后

BackgroundWorker_Completed()
{
    if (s.Result != null && e.Result is Exception)
    {
       Exception ex = e.Result as Exception;
       // do something with ex
    }
}

关于c# - BackgroundWorker 线程必须是 STA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12719970/

相关文章:

c# - 更新包含 Entity Framework 中的对象列表的对象的最佳方法

c# - 使用 dataTable 从 dataGridView 中删除行

c# - WPF 设计器错误声明当应用 StaticResource 时我的自定义 UserControl 为 "Could not create an instance of type..."

c# - 如何在鼠标悬停时突出显示 MahApps.Metro 的图 block ?

WPF 和初始焦点

c# - 如何通过单击wpf中的按钮来使用TabIndex导航光标?

c# - 将 int[] 转换为 object[]

c# - 计算/排序文本文件中的字符

c# - 在字典和集合上自动添加索引器是一个好的设计决策吗?

c# - CommandParameter 上的 DataContext 与 Command 本身上的 DataContext 不同