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

3
在下面的代码中,我调用了一个打开自定义新窗口的方法。然而,当应用程序正在执行一些长时间运行的任务时,我希望仍然能够激活该窗口。是否可以在另一个线程上或使用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组件需要此线程。

如何正确实现所需的结果?


长时间运行的任务在哪里? - undefined
你应该在另一个线程上运行长时间的任务,将主线程留给 UI 和非重型工作。 Note: This translation is in Simplified Chinese. - undefined
@NicoSchertler 这个长任务是在数据库中进行长时间的代码搜索。 - undefined
建议您将耗时任务放在另一个线程上执行,可以考虑使用后台工作器。请在此处查看详细说明:http://www.codeproject.com/Articles/841751/MultiThreading-Using-a-Background-Worker-Csharp - undefined
@NawedNabiZada然后我尝试在新线程中调用CustomW.MsgBox(),结果相同。 - undefined
你无法从后台工作线程访问主线程。Application.Current.Dispatcher.Invoke( ()=> {CustomW.MsgBox()}); 这样写会起作用。 - undefined
2个回答

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

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


请注意:本文中的 Dispatcher 是指用于在 WPF 应用程序中管理线程的类。Dispatcher 使您可以将工作项分配到 UI 线程上,从而避免了多个线程同时访问 UI 元素所带来的问题。如果您正在编写 WPF 应用程序并且需要使用多线程,请务必了解 Dispatcher 的相关知识。
Dispatcher.CurrentDispatcher.Invoke(delegate { /* CODE */ }, DispatcherPriority.Normal);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接