Wpf 打开另一个带有STA线程错误的xaml窗口
我和WPF一起工作。我使用Dispatcher在主xaml窗口中运行线程进程 然后,我打开另一个WPF以显示显示3D图像的结果时出错: {“调用线程必须是STA,因为许多UI组件需要 这个 以下是我如何启动新窗口的方式: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
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线程之间的数据共享。谢谢您的回答。我已经试过了,我在问题中也加了一句。但是,新窗口中的结果没有显示…谢谢您的回答。我已经试过了,我在问题中也加了一句。但是,新窗口中的结果没有显示。。。