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,因为许多UI组件都需要它。VB.NET_Wpf_Vb.net_Multithreading - Fatal编程技术网

Wpf 调用线程必须是STA,因为许多UI组件都需要它。VB.NET

Wpf 调用线程必须是STA,因为许多UI组件都需要它。VB.NET,wpf,vb.net,multithreading,Wpf,Vb.net,Multithreading,我试图显示一个msgbox,并让用户选择是或否。我收到一条DataTableMessage,其中我使用msgbox中的3行值。我得到一个错误,调用线程必须是STA,因为许多UI组件都需要它 我正在使用vb.net和WFP。发生此错误的代码如下所示: If MsgBox("Message Text Here" , MsgBoxStyle.YesNo, "Caption Here") = MsgBoxResult.No Then 'Do something Else

我试图显示一个msgbox,并让用户选择是或否。我收到一条DataTableMessage,其中我使用msgbox中的3行值。我得到一个错误,调用线程必须是STA,因为许多UI组件都需要它

我正在使用vb.net和WFP。发生此错误的代码如下所示:

 If MsgBox("Message Text Here"
, MsgBoxStyle.YesNo, "Caption Here") = MsgBoxResult.No 

Then 'Do something

            Else
'Do Something
            End If

您必须在与UI线程不同的线程中显示此MessageBox

请使用以下命令执行此操作:

一,

使用Invoke not BeginInvoke,因为这是一个MessageBox,可能是 决定因素。delay inn的能见度可能无法承受:

这也是c代码,因为我是c开发人员 在VB中也是如此

二,。 如果不想使用Dispatcher,则还可以在UI线程中使用Create Thread,而不是在其他线程中使用:

但是不要在线程中执行不必要的代码。您的UI可能会被阻止


不适用于VB.NET@StepUp@StepUp没有关系。OP正在使用VB的MsgBox函数,该函数是WinForms消息框的包装器。@shaunmorehammeredenovan您使用了错误的方法。在WPF中,使用WPF。另外,您是否显示来自主线程或其他线程的消息框(例如在回调中),或响应thread.Timer事件?MsgBox工作正常,这就是他可以看到错误消息的原因。不要从工作线程更新UI。或者使用错误的消息框类-OP使用的是Windows窗体方法。UI线程冲突的错误消息不同No,AFAIK导致此错误的是MessageBox.show。如果我从另一个线程执行Window.Height=200,那么我将得到一些资源所有者类型异常@当VB.NET是唯一的语言标记时,请在VB.NET中发布答案。相反,这是不被接受的,所以同样的规则在这里也适用。Lambda语法在这两种语言之间有很大的不同,这会让不熟悉这种语言的人感到困惑。我不是VB开发人员。所有这些在C语言中也适用。我只是在等待OP给出更多细节,然后再回答或关闭重复的答案。有很多重复的问题,而且有多个答案只会让下一个寻找答案的人更加困难answer@MattWilko好啊完成。
 Application.Current.Dispatcher.Invoke(Sub()

   ' Message Box CODE 

  End Sub)
Task.Factory.StartNew(Sub()

                          End Sub,
                          CancellationToken.None,
                          TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()
                          )