问题标签 [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.
.net - .NET SynchronizationContext - 它发送/发布到哪个线程?
我计划使用SynchronizationContext类来执行 UI 更新的一些跨线程编组。这个想法是为了避免必须引用主要形式(即 in Application.Run(form)
),所以我可以说mainForm.BeginInvoke();
但是,文档中不清楚的一件事是,当您调用 时SynchronizationContext.Post()
,它会将调用编组到哪个线程。它总是主应用程序线程,还是首先初始化SynchronizationContext
对象的线程,还是什么?
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 最终在原始线程上)等等。我尝试过的没有任何效果。
c# - 创建 SynchronizationContext 时的异常做法?
我正在创建用于 Windows Workflow 4.0的 STA 版本的SynchronizationContext 。我想知道在发布回调时如何处理异常。
SynchronizationContext可用于发送(同步执行)或发布(异步执行)类型为SendOrPostCallback的委托。尽管在这两种情况下我都在 STA 线程上调用委托,但很容易知道如何在同步执行时处理异常。我阻塞调用线程,在我的工作线程上调用回调,记录任何异常,解除阻塞调用线程,并在调用线程上抛出任何记录的异常。
我应该在异步Post上做什么不太清楚。没有将异常从执行线程传回调用线程的机制;发布是 100% 火,然后忘记。SendOrPostCallback中 没有EndInvoke()或WaitHandle。抛出的任何异常都将导致应用程序被拆除。
我是否别无选择,只能让Post中引发的异常破坏我的应用程序?这似乎是框架中SynchronizationContexts中的默认行为(谢谢,Reflector)。我似乎无法弄清楚这是为什么。难道不应该有一些方法来防止异步Post繁荣吗?
c# - Why is SynchronizationContext.Current null in my Winforms application?
I just wrote this code:
but System.Threading.SynchronizationContext.Current is null
.net - 使用 SynchronizationContext 将事件发送回 WinForms 或 WPF 的 UI
我正在使用 SynchronizationContext 将事件从我的 DLL 编组回 UI 线程,该 DLL 执行大量多线程后台任务。
我知道单例模式不是最喜欢的,但我现在使用它来在创建 foo 的父对象时存储 UI 的 SynchronizationContext 的引用。
这在 WPF 中根本不起作用,TheUISync 实例 UI 同步(从主窗口提供)永远不会匹配当前的 SynchronizationContext.Current。在 Windows 窗体中,当我做同样的事情时,它们将在调用后匹配,我们将回到正确的线程。
我讨厌的修复看起来像
所以我希望这个示例足够有意义。
c# - SynchronizationContext.Send 和 SynchronizationContext.Post 有什么区别?
感谢 Jeremy Miller 在为日常 .NET 开发的函数式编程方面所做的出色工作,我有一个工作命令执行器,它可以执行我想做的所有事情(在线程池上进行繁重的工作,将结果或错误发送回同步上下文,甚至发布回到同步上下文),但我无法解释为什么它使用来自线程池的SynchronizationContext.Send和从传递到执行繁重工作的方法中的Synchronization.Post 。Func
我已多次阅读文档,但我无法直观地了解其中的区别。我应该从一个被调用Send
和一个被调用的事实中得到Post
什么?我觉得魔法就在事实中Send
“启动同步请求”和Post
“启动异步请求”,但两个请求都来自线程池,需要发送/回传到 UI 线程。
有人可以解释其中的区别吗,即使它只是一个让我知道何时选择一个而不是另一个的助记设备?
万一这很重要,这是我用来将进度发送回 UI 的测试代码:Post
该_ExecuteCommand
方法作为以下command
参数传入,主要来自原始文章,用于Send
将完成和错误消息发送回 UI:
wpf - Dispatcher 和 SynchronizationContext 类
有人可以告诉我何时使用 aDispatcher
以及何时使用SynchronizationContext
该类吗?
一段时间以来,我一直在使用Dispatcher
从后台线程排队任务,然后我发现了SynchronizationContext
.
c# - 在 .net 2.0 上下文中使用的 Dispatcher 类(来自 .net 3.0)的替代方案
我需要(.net 3.0)的替代品用于Dispatcher
Windows 服务(在 .net 2.0 中完成)。你能给我一些想法如何实现这样的事情或给我一些链接吗?
我知道调度员有一个SynchronizationContext
背后,但我不知道如何使用SynchronizationContext
一个服务。
如果您认为我应该坚持使用Dispatcher
(.net 3.0) ...我该如何操作它 ( OnServiceStop
, OnServiceStart
)
编辑: 更多细节(另见......这里)
想法是我想在我的 Windows 服务中托管一些扩展/插件,这些扩展/插件将通过方法相互通信ExecuteCommand(type, params)
。
如果它是从插件内部执行的,此方法还会向服务引发一个事件,以便接收结果。每个插件都可以有自己的线程,从那里调用此方法ExecuteCommand
,因此我想将所有调用收集并同步到一个线程(主服务线程)中,以便适当地返回结果。
这就是 Dispatcher 发挥作用的原因。但我想在 .net 2.0 中拥有一些东西,或者你认为 Dispatcher 对我来说好用吗?
谢谢。
.net - 为什么 SynchronizationContext 不能正常工作?
我有以下代码:
我希望最后一个方法在第一个线程中执行,即从中获取 SynchronizationContext 的初始线程,因为我调用Post()
了这个上下文的方法。即是这样的:
不就是SynchronizationContext的意思吗?但实际上我有以下输出:
问题是什么?SynchronizationContext 有问题还是我有一些误解?
更新:我将此方法称为使用 Resharper 测试运行程序的单元测试。
c# - 从给定线程获取 SynchronizationContext
我似乎没有找到如何获得SynchronizationContext
给定的Thread
:
我为什么需要那个?
因为我需要从整个前端应用程序的不同位置发布到 UIThread。所以我在一个名为UIConfiguration
. 我在方法中设置了这个属性Program.Main
:
在那一刻,我可以确定我有正确的线程,但是我不能设置像这样的静态属性
因为尚未安装该类的 WinForms 实现。由于每个线程都有自己的 SynchronizationContext,因此必须可以从给定Thread
对象中检索它,还是我完全错了?