Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 打开另一个带有STA线程错误的xaml窗口_Wpf_Dispatcher - Fatal编程技术网

Wpf 打开另一个带有STA线程错误的xaml窗口

Wpf 打开另一个带有STA线程错误的xaml窗口,wpf,dispatcher,Wpf,Dispatcher,我和WPF一起工作。我使用Dispatcher在主xaml窗口中运行线程进程 然后,我打开另一个WPF以显示显示3D图像的结果时出错: {“调用线程必须是STA,因为许多UI组件需要 这个 以下是我如何启动新窗口的方式: void DisplayFormThread() { IResult result = _mainWindow.GetResult(); ResultView resultView = new ResultView (result); resultVie

我和WPF一起工作。我使用Dispatcher在主xaml窗口中运行线程进程

然后,我打开另一个WPF以显示显示3D图像的结果时出错:

{“调用线程必须是STA,因为许多UI组件需要 这个

以下是我如何启动新窗口的方式:

void DisplayFormThread()
{
    IResult result = _mainWindow.GetResult();
    ResultView resultView = new ResultView (result);
    resultView.Show();
}
我试图通过在stackoverflow的一些帖子中添加这一点来解决这个问题,但没有任何帮助:

ThreadStart start = delegate()
{
   DispatcherOperation op = Dispatcher.CurrentDispatcher.BeginInvoke(
        new delegateNewWindow(DisplayFormThread), DispatcherPriority.Background);

        DispatcherOperationStatus status = op.Status;
                   while (status != DispatcherOperationStatus.Completed)
                   {
                            status = op.Wait(TimeSpan.FromMilliseconds(1000));
                            if (status == DispatcherOperationStatus.Aborted)
                            {
                                 // Alert Someone
                            }
                    }

       };

// Create the thread and kick it started!
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
我怎样才能解决这个问题


提前谢谢

WPF要求thred为STA类型,因此如果希望STA调用DisplayFormThread,则必须执行以下操作:

Thread newThread = new Thread(new ThreadStart(DisplayFormThread));
newThread.SetApartmentState(ApartmentState.STA);
newThread.Start();

StatThread指的是“单线程单元”,它指的是当前(主)线程使用的线程模型。基本上,通过[StatThread]声明,其他应用程序在向您发送数据时将知道您的线程策略是什么。STA模型是Windows线程/应用程序最常见的线程模型。您可以阅读有关公寓状态的更多信息。

WPF要求thred为STA类型,因此,如果您希望STA调用DisplayFormThread,您必须执行以下操作:

Thread newThread = new Thread(new ThreadStart(DisplayFormThread));
newThread.SetApartmentState(ApartmentState.STA);
newThread.Start();

StatThread指的是“单线程单元”,它指的是当前(主)线程使用的线程模型。基本上,通过[StatThread]声明,其他应用程序在向您发送数据时将知道您的线程策略是什么。STA模型是Windows线程/应用程序最常见的线程模型。您可以阅读有关单元状态的更多信息。

原因是我们新创建的线程未启用以支持WPF窗口基础结构。特别是,它不支持Windows消息泵送,您必须为新创建的窗口运行单独的调度程序

原因是我们新创建的线程无法支持WPF窗口基础结构。特别是,它不支持Windows消息泵送,您必须为新创建的窗口运行单独的调度程序

必须在单线程单元(sta)中声明UI对象,并且必须为每个sta线程创建一个新的调度程序

必须在thread start的操作参数内调用
Dispatcher.Run()

ThreadStart start = delegate() {
    DispatcherOperation op = Dispatcher.CurrentDispatcher.BeginInvoke(
    new delegateNewWindow(DisplayFormThread), DispatcherPriority.Background);

    DispatcherOperationStatus status = op.Status;
    while (status != DispatcherOperationStatus.Completed) {
        status = op.Wait(TimeSpan.FromMilliseconds(1000));
        if (status == DispatcherOperationStatus.Aborted) {
            // Alert Someone
        }
    }
    Dispatcher.Run();
};

// Create the thread and kick it started!
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

WPF UI线程需要一个调度程序,因为调度程序管理多个UI线程之间的数据共享。

必须在单线程单元(sta)中声明UI对象,并且必须为每个sta线程创建一个新的调度程序

必须在thread start的操作参数内调用
Dispatcher.Run()

ThreadStart start = delegate() {
    DispatcherOperation op = Dispatcher.CurrentDispatcher.BeginInvoke(
    new delegateNewWindow(DisplayFormThread), DispatcherPriority.Background);

    DispatcherOperationStatus status = op.Status;
    while (status != DispatcherOperationStatus.Completed) {
        status = op.Wait(TimeSpan.FromMilliseconds(1000));
        if (status == DispatcherOperationStatus.Aborted) {
            // Alert Someone
        }
    }
    Dispatcher.Run();
};

// Create the thread and kick it started!
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

WPF UI线程需要一个调度程序,因为调度程序管理多个UI线程之间的数据共享。

谢谢您的回答。我已经试过了,我在问题中也加了一句。但是,新窗口中的结果没有显示…谢谢您的回答。我已经试过了,我在问题中也加了一句。但是,新窗口中的结果没有显示。。。