您可以在SO上找到很多类似的问题,但是没有一个问题(如我所见)涵盖了您的逻辑必须返回某些内容的情况。

在此代码示例中,我有一个简单的CustomMessageBox(它是一个窗口),它必须返回用户输入的内容。

public class CustomMessageBox
{
  private string Value
  {
      get
      {
          return txt_box.Text;
      }
  }

  private CustomMessageBox ()
  {
      InitializeComponent();
  }

  public static string Show(string caption = "Enter data")
  {
      CustomMessageBox cmb = new CustomMessageBox ();
      cmb.txt_block.Text = caption;

      cmb.ShowDialog();

      return cmb.Value;
  }
}

因此,当Show调用BackgroundWorker方法时,构造函数尝试执行时会在第一行引发异常。异常消息是
An exception of type 'System.InvalidOperationException' occurred in
PresentationCore.dll but was not handled in user code


Additional information: The calling thread must be STA,
because many UI components require this.

没什么新鲜的,但是我找不到解决此问题的方法,也无法使线程成为STA。 Show方法签名必须像下面这样清楚-接受字符串并返回字符串。

这样的事情通常必须如何解决?

最佳答案

public static string Show(string caption = "Enter data")
{
    Application.Current.Dispatcher.Invoke(new Action(() =>
    {
        CustomMessageBox cmb = new CustomMessageBox();
        cmb.txt_block.Text = caption;
        cmb.ShowDialog();
    }));
    return cmb.Value;
}

关于c# - InvalidOperationException : The calling thread must be STA,,因为许多UI组件都需要这样做,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32092637/

10-13 01:47