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

时间:2016-02-08 12:46:28

标签: 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()
       );
}

但是当我使用新线程时,我收到以下错误。

  

调用线程必须是STA,因为许多UI组件需要此

达到所需结果的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

使用此功能:

 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
            }));

答案 1 :(得分:1)

看看Dispatcher
https://msdn.microsoft.com/cs-cz/library/system.windows.threading.dispatcher%28v=vs.110%29.aspx

Dispatcher.CurrentDispatcher.Invoke(delegate { /* CODE */ }, DispatcherPriority.Normal);