c# - WPF 在另一个线程上打开新窗口

标签 c# wpf multithreading

在下面的代码中,我调用了打开自定义新窗口的方法。但是,当应用程序正在执行一些长时间运行的任务时,我希望仍然能够激活窗口。是否可以在另一个线程上或使用 Task 类来完成?

public static class CustomW
{
    static Custom_Window_Chrome_Demo.ThemedWindow MsgBox(string Msgbx_TTL, string Msgbx_Contnt)
    {
        var w_mbx = new Custom_Window_Chrome_Demo.ThemedWindow();
        w_mbx.Width = 950; w_mbx.Height = 159;
        w_mbx.Title = Msgbx_TTL;

        Grid g = new Grid();
        StackPanel spM = new StackPanel();
        TextBlock TblckErrMsg = new TextBlock();
       //more settings......
    } 
}

这就是我尝试调用它的方式,

public void newMsgBoxShow(string Msgbx_TTL, string Msgbx_Contnt)
{
    System.Threading.Thread s = new System.Threading.Thread( 
       ()=>
        CustomW.MsgBox(Msgbx_TTL, Msgbx_Contnt).Show()
       );
}

但是当我使用新线程时出现以下错误。

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

获得所需结果的正确方法是什么?

最佳答案

使用这个:

 Task.Factory.StartNew(new Action(() =>
            {
                //your window code
            }), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

当使用当前同步上下文创建新线程时,它将能够更新 UI。(当当前线程是 UI 线程时)

您还可以使用调度程序来执行您的代码。

 System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(()=>
            {
                //your window code
            }));

关于c# - WPF 在另一个线程上打开新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35270032/

相关文章:

java - InterruptedIOException 是否将线程的 Interrupted 标志设置为 true?

c# - DMCS 中的 D 代表什么?

c# - 在运行时更新 dbfirst Entity Framework 模型的方法

WPF 在 TextBlock 上设置默认样式会覆盖标签的样式

Java 100个左右的并行线程,内存管理

java - 使用 contextDestroyed 干预长时间运行的线程

c# - 在 Wp7 中访问相机,带缩放

c# - 找不到 ASP.NET Core 2 MySQL 8.0.8-dmr Entity Framework 扩展

c# - IDataErrorInfo 调用绑定(bind)对象而不是 DataContext

c# - 有没有更好的方法在 ViewModel 上编写此代码?