C# ActiveX控件';6bf52a52-394a-11d3-b153-00c04f79faa6和x27;无法实例化,因为当前线程不在单线程单元中

C# ActiveX控件';6bf52a52-394a-11d3-b153-00c04f79faa6和x27;无法实例化,因为当前线程不在单线程单元中,c#,multithreading,C#,Multithreading,我有一个C#主windows窗体,它监听UDP端口以获取消息。收到所需消息后,它将启动另一个表单(视频表单)。此视频表单包含一个axWindowsMediaPlayer1,用于播放视频 但每当收到启动视频表单的消息时,它都会收到一个UDP错误“ActiveX控件‘6bf52a52-394a-11d3-b153-00c04f79faa6’无法实例化,因为当前线程不在单线程单元中。” 该错误将在此行中抛出 axWindowsMediaPlayer1=新的AxWMPLib.AxWindowsMedia

我有一个C#主windows窗体,它监听UDP端口以获取消息。收到所需消息后,它将启动另一个表单(视频表单)。此视频表单包含一个axWindowsMediaPlayer1,用于播放视频

但每当收到启动视频表单的消息时,它都会收到一个UDP错误“ActiveX控件‘6bf52a52-394a-11d3-b153-00c04f79faa6’无法实例化,因为当前线程不在单线程单元中。”

该错误将在此行中抛出 axWindowsMediaPlayer1=新的AxWMPLib.AxWindowsMediaPlayer()


我已在线搜索,如何创建STA?

[STAThread]
属性添加到
Main
方法。

您的主要问题是serverSocket.BeginReceiveFrom()的回调在线程池线程上运行。您可能已经得到了一个强烈的警告,它使您将CheckForIllegalCrossThreadCalls设置为false。这不是一件明智的事情,它只是阻止Winforms告诉您做错了,它并没有阻止您做错。解释异常变得越来越困难确实是结果。你很幸运地得到了一个,更典型的是,它可以正常工作,但会使你的程序以随机和不可诊断的方式失败


只能在主线程上调用影响UI的代码,如txtLog.Text赋值。创建新表单也只能在主线程上完成。在OnReceive()回调中使用主窗体的BeginInvoke()方法(或txtLog.BeginInvoke方法)来完成此操作。

将运行
axWindowsMediaPlayer1
的线程
ApartmentState
属性设置为
ApartmentState.STA
如下:

newThread.ApartmentState = ApartmentState.STA;
更好的方法是阅读MSDN


希望这对你有帮助

我的主方法已经有[StatThread]。默认情况下,由C#windows窗体创建的program.cs已经有了它…但即使我不更新txtLog.Text,错误仍然会发生。当然,但我们无法看到您在btnPlayVideo_Click()中执行的操作。我的水晶球上写着:我打赌他用那个代码创建了一个新的表单。它有一个ActiveX控件,上面写着“你在错误的线程上创建了我!!!”。是的,你的水晶球是对的!右边是一个按钮,它将启动一个带有mediaplayer activeX控件的视频表单。如果我用鼠标点击一下,它就会工作。但是,当我通过UDP远程调用执行此操作时,它将不起作用。如何在主窗体线程上启动videoform?使用BeginInvoke()方法进行询问和回答。私有void StartVideoForms(){v1=StartVideoForm(s1);//v1.Show();v2=StartVideoForm(s2);//v2.Show();}私有委托视频形式StartVideoFormDelegate(字符串url);私有VideoForm StartVideoForm(字符串url){if(this.invokererequired){this.BeginInvoke(新的StartVideoFormDelegate(StartVideoForm),新对象[]{url});返回null;}返回新的VideoForm(url);}
newThread.ApartmentState = ApartmentState.STA;