【问题标题】:The calling thread must be STA, because many UI components require this. VB.NET调用线程必须是 STA,因为许多 UI 组件都需要这个。 VB.NET
【发布时间】:2016-02-17 20:51:57
【问题描述】:

我正在尝试显示一个 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

【问题讨论】:

  • 不适用于 VB.NET @StepUp
  • @StepUp 不相关。 OP 正在使用 VB 的 MsgBox 函数,它是 WinForms 消息框的包装器。
  • @ShaunMorehammeredDenovan 您使用了错误的方法。在 WPF 中,使用 WPF MessageBox class。此外,您是从主线程还是其他线程显示消息框,例如在回调中,还是响应 Thread.Timer 事件?
  • MsgBox 工作正常,这就是他可以看到错误消息的原因。不要从工作线程更新 UI。

标签: wpf vb.net multithreading


【解决方案1】:

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

使用下面的来做到这一点:

1.

 Application.Current.Dispatcher.Invoke(Sub()

   ' Message Box CODE 

  End Sub)

使用Invoke 而不是BeginInvoke,因为这是MessageBox,可能是 决定因素。延迟客栈的知名度可能无法承受。 :)

这也是 c# 代码,因为我是 c# 开发人员。但是这个概念 在VB 中是相同的。

2. 如果不想使用Dispatcher,那么您也可以使用(在 UI 中创建 Thread Thread 而不是在另一个 Thread 中):

Task.Factory.StartNew(Sub()

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

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

【讨论】:

  • 或使用 wrong 消息框类 - OP 正在使用 Windows 窗体方法。 UI线程违规的错误消息不同
  • 不,AFAIK 是 MessageBox.show() 会导致此错误。如果我从另一个线程执行 Window.Height=200 ,那么我会得到一些资源所有者类型的异常。 @PanagiotisKanavos
  • 当这是唯一的语言标签时,请在 VB.NET 中发布答案。这不被接受,所以同样的规则在这里适用。两种语言之间的 Lambda 语法有很大不同,这可能会使刚接触该语言的人感到困惑
  • 我不是 VB 开发人员。所有这些在 C# 中也成立。我只是在等待 OP 在回答或关闭答案之前提供更多详细信息。 很多重复的问题,并且有多个答案只会让下一个搜索答案的人更难
  • @MattWilko 好的。完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多