C# 在另一个AppDomain中调用Wait时没有SynchronizationContext

C# 在另一个AppDomain中调用Wait时没有SynchronizationContext,c#,multithreading,winforms,async-await,appdomain,C#,Multithreading,Winforms,Async Await,Appdomain,我已经成功地构建了一个插件机制,我可以在一个单独的AppDomain中创建UI控件,并将它们作为表单的一部分显示在主AppDomain中 这些UI控件自己加载数据,所以当我打开表单时,大约会创建10个不同的插件,每个插件都需要加载数据 同样,如果我同步执行,这一切都很好,但我希望在每个插件中使用异步/等待模式。我的刷新方法如下所示: protected async void RefreshData() { _data = await LoadAsync(_taskId); <=

我已经成功地构建了一个插件机制,我可以在一个单独的AppDomain中创建UI控件,并将它们作为表单的一部分显示在主AppDomain中

这些UI控件自己加载数据,所以当我打开表单时,大约会创建10个不同的插件,每个插件都需要加载数据

同样,如果我同步执行,这一切都很好,但我希望在每个插件中使用异步/等待模式。我的刷新方法如下所示:

protected async void RefreshData()
{ 
    _data = await LoadAsync(_taskId);  <= UI Thread     :)
    OnDataChanged();                   <= Worker Thread :( 
}
受保护的异步void RefreshData()
{ 

_data=await LoadAsync(_taskId);我终于想出了如何从一个单独的AppDomain中返回UI线程,而不需要控件句柄

由于我的视图模型总是在UI线程上实例化,因此我只需获取当前的调度程序:

_dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher
现在在我的RefreshData方法中,我所要做的就是在等待之后分派我想要执行的操作

protected async void RefreshData()
{ 
    _data = await LoadAsync(_taskId);            <= UI Thread :)
    _dispatcher.Invoke(() => OnDataChanged());   <= UI Thread :)
}
受保护的异步void RefreshData()
{ 

_data=await LoadAsync(_taskId);OnDataChanged());我认为多编写一点代码会有所帮助,因为我个人很难想象代码在哪里执行。此外,可能会也可能不会提供一些帮助(基本思想:使用自定义的
SynchronizationContext
包装,而不是依赖默认值)。我真的不知道还有什么其他代码要发布。表单位于主appDomain中,每个控件+视图模型都位于单独的appDomain中。这一小部分代码位于视图模型中,因此它在这个单独的appDomain中运行。主UI线程出现并启动该方法,但当Wait完成时,我处于不同的线程上。(这都是因为我在一个单独的appDomain中,其中SyncronizationContext为null)我尝试了您之前指出的文章中的建议,但也没有成功:
var syncCtx=SynchronizationContext.Current??new SynchronizationContext();
\u data=await LoadAsync(\u taskId);
syncCtx.Send(OnDataChanged,null)
为什么不捕获
同步上下文
,然后在另一个AppDomain中将其设置为当前上下文?嗨,Stephen,读了你的几篇文章后,我希望你能对此发表评论。我刚刚尝试了你的想法,但当我试图将同步上下文从我的主AppDomain传递到插件AppDomain:Type'System.Windows.Forms.WindowsFormsSynchronizationContext'in Assembly'System.Windows.Forms,Version=4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089'未标记为可序列化。抱歉,我对AppDomains知之甚少。没问题,谢谢你的建议。不过,我认为这正是出现这种情况的原因当任何SynchronizationContext进入另一个appDomain时,它首先在主线程上不是任何SynchronizationContext。该上下文不可序列化,因此无法在appDomain中重建。它也不是从MarshalByRefObject派生的,因此不能用作远程对象。