首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向主线程发送?

如何向主线程发送?
EN

Stack Overflow用户
提问于 2022-10-19 20:36:21
回答 2查看 95关注 0票数 1

我想从.Net 6中的主线程(UI线程)中的一个非主线程中使用C#执行一些代码。

我试过使用以下代码:

代码语言:javascript
复制
await Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal,
    () => { }
);

这不起作用,因为Windows.UI.Core.CoreWindow.GetForCurrentThread()返回null

我的第二次尝试是:

代码语言:javascript
复制
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal,
    () => { }
);

这是失败的,因为Windows.ApplicationModel.Core.CoreApplication.MainView抛出一个System.InvalidOperationException

另一种方式应该是:

代码语言:javascript
复制
await System.Windows.Threading.Dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal,
    () => { }
);

但是System.Windows.Threading名称空间对我来说是不可用的,因为我使用的是.Net 6,并且不再支持它。

知道吗,我如何从主线程(UI线程)内的非主线程执行一些代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-27 05:41:55

SynchronizationContext是切换到主线程的很好的解决方案。但并不是所有的.Net应用程序类型都能实现它。

例如,对于控制台应用程序,没有实现解决方案。

但是对于Windows来说,[WindowsFormsSynchronizationContext][2]工作得很好。

代码语言:javascript
复制
private SynchronizationContext _synchronizationContext;

内部初始化,在主线程中调用:

代码语言:javascript
复制
_synchronizationContext = new WindowsFormsSynchronizationContext();

在此之后,您可以从另一个线程调用:

代码语言:javascript
复制
SynchronizationContext.SetSynchronizationContext(_synchronizationContext);

... here we are in a separate thread

_synchronizationContext.Post(
    (state) => {
        ... this will be executed in the main thread
    },
    null);
票数 0
EN

Stack Overflow用户

发布于 2022-10-19 20:58:42

我想用C#从.Net 6中的主线程(UI线程)中的一个非主线程执行一些代码。

我强烈建议您不要这样做,让您的async方法在必要时使用类似IProgress<T>的东西间接更新UI是非常干净的。如果您构建代码,使主线程调用后台线程,而不是通过UI线程操作UI的后台线程,那么最终您将得到一个更加简洁的设计,在这里,您的逻辑与UI控件没有那么紧密的联系。

也就是说,如果您真的想要这样做,那么解决方案是在后台工作开始之前捕获UI线程上的dispatcher,并让后台工作在向UI线程发布工作时使用该dispatcher (而不是“当前dispatcher")。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74131599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档