1

「多くのUIコンポーネントでSTAが必要なため、呼び出し元のスレッドはSTAである必要があります」というメッセージが表示されたInvalidOperationExceptionが発生しています。参照ライブラリに大きく依存する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;
    }
...
4

3 に答える 3

8

私の推測では、例外の原因であるバックグラウンド スレッドから UI 要素を作成していると思われます。

読んだ:

于 2012-07-11T19:57:04.363 に答える
0

Rafalの投稿のおかげで解決しました:

問題は、新しい MyParticipant を作成していたスレッドがデフォルトで MTA に設定されていたため、MyParticipant 内で、その MTA スレッドが新しい VideoRenderer を呼び出していたことです。これは Image を継承します。UI コントロールを構築する MTA スレッドにより、この例外が発生します。

于 2012-07-12T14:35:49.977 に答える