我想从.Net 6中的主线程(UI线程)中的一个非主线程中使用C#执行一些代码。
我试过使用以下代码:
await Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
() => { }
);这不起作用,因为Windows.UI.Core.CoreWindow.GetForCurrentThread()返回null。
我的第二次尝试是:
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
() => { }
);这是失败的,因为Windows.ApplicationModel.Core.CoreApplication.MainView抛出一个System.InvalidOperationException。
另一种方式应该是:
await System.Windows.Threading.Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
() => { }
);但是System.Windows.Threading名称空间对我来说是不可用的,因为我使用的是.Net 6,并且不再支持它。
知道吗,我如何从主线程(UI线程)内的非主线程执行一些代码?
发布于 2022-11-27 05:41:55
SynchronizationContext是切换到主线程的很好的解决方案。但并不是所有的.Net应用程序类型都能实现它。
例如,对于控制台应用程序,没有实现解决方案。
但是对于Windows来说,[WindowsFormsSynchronizationContext][2]工作得很好。
private SynchronizationContext _synchronizationContext;内部初始化,在主线程中调用:
_synchronizationContext = new WindowsFormsSynchronizationContext();在此之后,您可以从另一个线程调用:
SynchronizationContext.SetSynchronizationContext(_synchronizationContext);
... here we are in a separate thread
_synchronizationContext.Post(
(state) => {
... this will be executed in the main thread
},
null);发布于 2022-10-19 20:58:42
我想用C#从.Net 6中的主线程(UI线程)中的一个非主线程执行一些代码。
我强烈建议您不要这样做,让您的async方法在必要时使用类似IProgress<T>的东西间接更新UI是非常干净的。如果您构建代码,使主线程调用后台线程,而不是通过UI线程操作UI的后台线程,那么最终您将得到一个更加简洁的设计,在这里,您的逻辑与UI控件没有那么紧密的联系。
也就是说,如果您真的想要这样做,那么解决方案是在后台工作开始之前捕获UI线程上的dispatcher,并让后台工作在向UI线程发布工作时使用该dispatcher (而不是“当前dispatcher")。
https://stackoverflow.com/questions/74131599
复制相似问题