You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:50:06