【发布时间】:2012-07-11 19:43:52
【问题描述】:
我遇到了 InvalidOperationException,并显示消息“调用线程必须是 STA,因为许多 UI 组件都需要这个。”在严重依赖引用库的 WPF 应用程序中。
我尝试确定错误的来源,使用各种线程和对象的调度程序,确保 main() 具有 STAthread 属性,尝试在看似相关的方法上设置“[STAThread]”。
在MyParticipant构造函数内部,由于继承了VideoRenderer的MyVideoRenderer pic正在构造,VideoRenderer构造函数本身抛出这个异常,没有进入构造函数。
代码:
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 的主线程上。