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

我遇到一个InvalidOperationException,消息“调用线程必须是STA,因为许多UI组件都需要这个。” 在WPF应用程序中,严重依赖于引用的库。

我试图确定错误的来源,使用各种线程和对象的调度程序,确保main()具有STAthread属性,尝试在看似相关的方法上设置“[STAThread]”。

在MyParticipant构造函数内部,正在构建MyVideoRenderer pic,它inheritance了VideoRenderer,VideoRenderer构造函数本身就抛出了这个exception,而没有进入构造函数。

码:

public class MyParticipant : Participant //inside MainWindow.xaml.cs { public enum PictureMode { Avatar, Video } public PictureMode pictureMode = PictureMode.Avatar; public ProgressBar voiceVolume; public Label nameLabel; public MyVideoRenderer pic; public MyVideo video; public bool isCachedInClient = false; public string displayName = null; public Image avatarImage = null; public static int picHeight = 480; public static int piclWidth = 640; public static int panelHeight = 155; public static int panelWidth = 174; public static Color liveColor = SystemColors.GradientActiveCaptionColor; public static Color nonLiveColor = SystemColors.GradientInactiveCaptionColor; public MyParticipant(uint objectId, VideoManager videoManager) : base(objectId, videoManager) { pic = new MyVideoRenderer(videoManagerRef) { //Top = 5, //Left = 5, Height = picHeight, Width = piclWidth, //SizeMode = PictureBoxSizeMode.StretchImage }; ... public class VideoRenderer : System.Windows.Controls.Image //referenced external class { public VideoRenderer(VideoManagerRoot videoManager) ///Exception here { this.videoManagerRef = videoManager; } ... 

我的猜测是你从后台线程创建UI元素,这是exception的原因。

读:

  • the-calling-thread-must-be-sta-because-many-ui-components-require-this-error ,or
  • 在-调用线程必须待STA-因为一对多的UI组件,需要,这

解决了,感谢拉法尔的post:

问题是创建新MyParticipant的线程默认设置为MTA,因此在MyParticipant中,该MTA线程正在调用新的VideoRenderer,它inheritance了一个Image。 构造UI控件的MTA线程导致此exception。

在(WPF应用程序)项目属性中,确保将启动对象设置为(未设置)。 这解决了我的问题。