Miracast接收器应用访问流数据时触发RPC_E_WRONG_THREAD线程错误
解决WinForm Miracast接收器的RPC_E_WRONG_THREAD线程错误
问题根源
你在WinForm环境中误用了WPF的System.Windows.Threading.Dispatcher来处理跨线程操作,而WinForm和WPF的线程调度机制完全不同。WinRT组件的MediaSourceCreated事件回调默认在后台线程触发,而访问MiracastReceiverStreamControl这类WinRT对象必须在UI线程执行,这才导致了跨线程调用错误。
解决方案
方法1:使用WinForm控件的Invoke方法
直接通过WinForm窗体或任意已创建的控件实例,切换到UI线程执行WinRT对象操作:
private void OnSessionMediaSourceCreated(MiracastReceiverSession sender, MiracastReceiverMediaSourceCreatedEventArgs args) { // 判断当前线程是否为UI线程,非UI线程则切换 if (this.InvokeRequired) { this.Invoke(new Action<MiracastReceiverSession, MiracastReceiverMediaSourceCreatedEventArgs>(OnSessionMediaSourceCreated), sender, args); return; } // 此时已在UI线程,可安全调用GetVideoStreamSettings try { MiracastReceiverVideoStreamSettings videoSettings = args.StreamControl.GetVideoStreamSettings(); // 这里添加你的视频设置处理逻辑 } catch (Exception ex) { // 错误捕获与处理 } }
方法2:使用SynchronizationContext(无控件依赖)
如果不想绑定到具体控件,可在UI线程初始化时保存同步上下文,后续用它切换线程:
private SynchronizationContext _uiSyncContext; // 在窗体构造函数或Load事件中初始化(必须在UI线程执行) public MainForm() { InitializeComponent(); _uiSyncContext = SynchronizationContext.Current; } private void OnSessionMediaSourceCreated(MiracastReceiverSession sender, MiracastReceiverMediaSourceCreatedEventArgs args) { _uiSyncContext.Post(state => { var eventArgs = state as MiracastReceiverMediaSourceCreatedEventArgs; MiracastReceiverVideoStreamSettings videoSettings = eventArgs.StreamControl.GetVideoStreamSettings(); // 处理视频设置逻辑 }, args); }
核心注意事项
- WinForm的线程调度依赖
Control.Invoke/BeginInvoke,WPF的Dispatcher对WinForm完全无效,不要混淆使用。 - 所有WinRT对象的属性访问、方法调用,必须回到该对象创建时所在的线程(通常是UI线程)。
内容的提问来源于stack exchange,提问作者p1nkman
相关产品推荐
相关产品推荐

