【问题标题】:"The calling thread must be STA, because many UI components require this." WPF“调用线程必须是 STA,因为很多 UI 组件都需要这个。” WPF
【发布时间】: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 的主线程上。

标签: c# .net wpf


【解决方案1】:

我的猜测是您正在从后台线程创建 UI 元素,这是导致异常的原因。

阅读:

【讨论】:

  • 谢谢你,拉法尔。第一个链接对理解问题有很大帮助:创建新 MyParticipant 的线程被默认设置为 MTA,因此在 MyParticipant 内部,MTA 线程正在调用新的 VideoRenderer,它继承了一个 Image。构造 UI 控件的 MTA 线程会导致此异常。
【解决方案2】:

已解决,感谢 Rafal 的帖子:

问题在于,创建新 MyParticipant 的线程被默认设置为 MTA,因此在 MyParticipant 内部,MTA 线程正在调用新的 VideoRenderer,它继承了一个 Image。构造 UI 控件的 MTA 线程会导致此异常。

【讨论】:

  • 为什么还没有修复?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多