问题标签 [synchronizationcontext]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1769 浏览

.net - .NET SynchronizationContext - 它发送/发布到哪个线程?

我计划使用SynchronizationContext类来执行 UI 更新的一些跨线程编组。这个想法是为了避免必须引用主要形式(即 in Application.Run(form)),所以我可以说mainForm.BeginInvoke();

但是,文档中不清楚的一件事是,当您调用 时SynchronizationContext.Post(),它会将调用编组到哪个线程。它总是主应用程序线程,还是首先初始化SynchronizationContext对象的线程,还是什么?

0 投票
1 回答
1339 浏览

c# - 没有第二种形式的多线程消息泵送

我有一个使用 COM 组件的 C# 应用程序。这个 COM 组件需要一个消息泵 (Application.Run()) 来完成它的处理。这意味着它被卡在主线程上。但我最近发现可以在另一个线程上启动另一个 Application.Run,​​它有自己的 ApplicationContext。

所以我想将 COM 组件托管在它自己的 Application.Run() 内的自己的线程上,但我不知道如何在不创建 UI 表单的情况下在新线程上开始工作。

我需要与线程通信的 WindowsFormsSynchronizationContext 直到 Application.Run() 才会创建。但是一旦 Application.Run() 被调用,我就无法弄清楚如何获得 SynchronizationContext。如果我可以只在该线程上引发一个事件,我可以使用它来引导整个事情(创建 COM 对象等),但似乎没有任何地方可以在没有表单的情况下挂钩到新的事件循环.

我已经尝试过各种复杂的事情,比如安装消息过滤器(在新线程上不会引发任何消息),将执行上下文复制到另一个线程并尝试从那里检索 SynchronizationContext(它拒绝复制 ExecutionContext已经运行线程),在启动 Application.Run() 然后调用 DoCallbBack() 之前检索 Thread.CurrentContext (DoCallback 最终在原始线程上)等等。我尝试过的没有任何效果。

0 投票
2 回答
1694 浏览

c# - 创建 SynchronizationContext 时的异常做法?

我正在创建用于 Windows Workflow 4.0的 STA 版本的SynchronizationContext 。我想知道在发布回调时如何处理异常。

SynchronizationContext可用于发送(同步执行)或发布(异步执行)类型为SendOrPostCallback的委托。尽管在这两种情况下我都在 STA 线程上调用委托,但很容易知道如何在同步执行时处理异常。我阻塞调用线程,在我的工作线程上调用回调,记录任何异常,解除阻塞调用线程,并在调用线程上抛出任何记录的异常。

我应该在异步Post上做什么不太清楚。没有将异常从执行线程传回调用线程的机制;发布是 100% 火,然后忘记。SendOrPostCallback中 没有EndInvoke()WaitHandle。抛出的任何异常都将导致应用程序被拆除。

我是否别无选择,只能让Post中引发的异常破坏我的应用程序?这似乎是框架中SynchronizationContexts中的默认行为(谢谢,Reflector)。我似乎无法弄清楚这是为什么。难道不应该有一些方法来防止异步Post繁荣吗?

0 投票
2 回答
18398 浏览

c# - Why is SynchronizationContext.Current null in my Winforms application?

I just wrote this code:

but System.Threading.SynchronizationContext.Current is null

0 投票
2 回答
23725 浏览

.net - 使用 SynchronizationContext 将事件发送回 WinForms 或 WPF 的 UI

我正在使用 SynchronizationContext 将事件从我的 DLL 编组回 UI 线程,该 DLL 执行大量多线程后台任务。

我知道单例模式不是最喜欢的,但我现在使用它来在创建 foo 的父对象时存储 UI 的 SynchronizationContext 的引用。

这在 WPF 中根本不起作用,TheUISync 实例 UI 同步(从主窗口提供)永远不会匹配当前的 SynchronizationContext.Current。在 Windows 窗体中,当我做同样的事情时,它们将在调用后匹配,我们将回到正确的线程。

我讨厌的修复看起来像

所以我希望这个示例足够有意义。

0 投票
1 回答
16117 浏览

c# - SynchronizationContext.Send 和 SynchronizationContext.Post 有什么区别?

感谢 Jeremy Miller 在为日常 .NET 开发的函数式编程方面所做的出色工作,我有一个工作命令执行器,它可以执行我想做的所有事情(在线程池上进行繁重的工作,将结果或错误发送回同步上下文,甚至发布回到同步上下文),但我无法解释为什么它使用来自线程池的SynchronizationContext.Send和从传递到执行繁重工作的方法中的Synchronization.Post 。Func我已多次阅读文档,但我无法直观地了解其中的区别。我应该从一个被调用Send和一个被调用的事实中得到Post什么?我觉得魔法就在事实中Send“启动同步请求”和Post“启动异步请求”,但两个请求都来自线程池,需要发送/回传到 UI 线程。

有人可以解释其中的区别吗,即使它只是一个让我知道何时选择一个而不是另一个的助记设备?

万一这很重要,这是我用来将进度发送回 UI 的测试代码:Post

_ExecuteCommand方法作为以下command参数传入,主要来自原始文章,用于Send将完成和错误消息发送回 UI:

0 投票
2 回答
7151 浏览

wpf - Dispatcher 和 SynchronizationContext 类

有人可以告诉我何时使用 aDispatcher以及何时使用SynchronizationContext该类吗?

一段时间以来,我一直在使用Dispatcher从后台线程排队任务,然后我发现了SynchronizationContext.

0 投票
1 回答
2046 浏览

c# - 在 .net 2.0 上下文中使用的 Dispatcher 类(来自 .net 3.0)的替代方案

我需要(.net 3.0)的替代品用于DispatcherWindows 服务(在 .net 2.0 中完成)。你能给我一些想法如何实现这样的事情或给我一些链接吗?

我知道调度员有一个SynchronizationContext背后,但我不知道如何使用SynchronizationContext一个服务。

如果您认为我应该坚持使用Dispatcher(.net 3.0) ...我该如何操作它 ( OnServiceStop, OnServiceStart)

编辑: 更多细节(另见......这里

想法是我想在我的 Windows 服务中托管一些扩展/插件,这些扩展/插件将通过方法相互通信ExecuteCommand(type, params)

如果它是从插件内部执行的,此方法还会向服务引发一个事件,以便接收结果。每个插件都可以有自己的线程,从那里调用此方法ExecuteCommand,因此我想将所有调用收集并同步到一个线程(主服务线程)中,以便适当地返回结果。

这就是 Dispatcher 发挥作用的原因。但我想在 .net 2.0 中拥有一些东西,或者你认为 Dispatcher 对我来说好用吗?

谢谢。

0 投票
3 回答
5793 浏览

.net - 为什么 SynchronizationContext 不能正常工作?

我有以下代码:

我希望最后一个方法在第一个线程中执行,即从中获取 SynchronizationContext 的初始线程,因为我调用Post()了这个上下文的方法。即是这样的:

不就是SynchronizationContext的意思吗?但实际上我有以下输出:

问题是什么?SynchronizationContext 有问题还是我有一些误解?

更新:我将此方法称为使用 Resharper 测试运行程序的单元测试。

0 投票
5 回答
12257 浏览

c# - 从给定线程获取 SynchronizationContext

我似乎没有找到如何获得SynchronizationContext给定的Thread

我为什么需要那个?

因为我需要从整个前端应用程序的不同位置发布到 UIThread。所以我在一个名为UIConfiguration. 我在方法中设置了这个属性Program.Main

在那一刻,我可以确定我有正确的线程,但是我不能设置像这样的静态属性

因为尚未安装该类的 WinForms 实现。由于每个线程都有自己的 SynchronizationContext,因此必须可以从给定Thread对象中检索它,还是我完全错了?