- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简而言之,我已经实现了一个派生自 SynchronizationContext 的类,以便 GUI 应用程序可以轻松地使用在 GUI 线程以外的线程上引发的事件。我非常感谢对我的实现的评论。具体来说,有什么你会反对或可能导致我没有预见到的问题的吗?我的初始测试已经成功。
长版:我目前正在开发分布式系统 (WCF) 的业务层,该系统使用回调将事件从服务器传播到客户端。我的设计目标之一是提供可绑定(bind)的业务对象(即 INotifyPropertyChanged/IEditableObject 等),以便在客户端轻松使用这些对象。作为其中的一部分,我提供了一个回调接口(interface)的实现,它在事件传入时处理事件,更新业务对象,进而引发属性更改事件。因此,我需要在 GUI 线程上引发这些事件(以避免跨线程操作异常)。因此,我尝试提供自定义 SynchronizationContext,实现回调接口(interface)的类使用它来将事件传播到 GUI 线程。此外,我希望这个实现独立于客户端环境——例如WinForms GUI 应用程序或 ConsoleApp 或其他东西。换句话说,我不想假设静态 SynchronizationContext.Current 可用。因此,我使用 ExecutionContext 作为后备策略。
public class ImplicitSynchronisationContext : SynchronizationContext
{
private readonly ExecutionContext m_ExecContext;
private readonly SynchronizationContext m_SyncContext;
public ImplicitSynchronisationContext()
{
// Default to the current sync context if available.
if (SynchronizationContext.Current != null)
{
m_SyncContext = SynchronizationContext.Current;
}
else
{
m_ExecContext = ExecutionContext.Capture();
}
}
public override void Post(SendOrPostCallback d, object state)
{
if (m_SyncContext != null)
{
m_SyncContext.Post(d, state);
}
else
{
ExecutionContext.Run(
m_ExecContext.CreateCopy(),
(object args) =>
{
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Invoker), args);
},
new object[] { d, state });
}
}
public override void Send(SendOrPostCallback d, object state)
{
if (m_SyncContext != null)
{
m_SyncContext.Send(d, state);
}
else
{
ExecutionContext.Run(
m_ExecContext.CreateCopy(),
new ContextCallback(this.Invoker),
new object[] { d, state });
}
}
private void Invoker(object args)
{
Debug.Assert(args != null);
Debug.Assert(args is object[]);
object[] parts = (object[])args;
Debug.Assert(parts.Length == 2);
Debug.Assert(parts[0] is SendOrPostCallback);
SendOrPostCallback d = (parts[0] as SendOrPostCallback);
d(parts[1]);
}
最佳答案
不幸的是你写了一些已经存在的东西。 SynchronizationContext 类完全按照您的要求进行操作。向您的主类添加一个属性,类似于此:
public static SynchronizationContext SynchronizationContext {
get {
if (SynchronizationContext.Current == null) {
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
return SynchronizationContext.Current;
}
}
或者使用 AsyncOperationManager.SynchronizationContext,它做的事情完全一样。当然更好。
关于c# - 从 SynchronizationContext 派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3944498/
我仍在学习整个任务概念和 TPL。根据我目前的理解,await 使用 SynchronizationContext 函数(如果存在)将任务分派(dispatch)到“某处”。另一方面,Task 类中的
感谢 Jeremy Miller 在 Functional Programming For Everyday .NET Development 中的出色工作,我有一个工作命令执行器,它可以做我想做的一
我使用 SynchronizationContext从 UI 线程上的后台线程调用方法。我读了this post它要求 Send 的差异和 Post .我明白答案并会调用Send每当我需要调用方法的结
我遇到了挂起等待的问题(描述 here )。在研究过程中,我发现调用 SetResult在我的 TaskCompletionSource实际上在调用 SetResult 的线程的上下文中调用等待继续(
public static void Init() { //var task = GetSource1(); //var task = GetSource2(); //var
在异步函数内部使用与外部不同的 SynchronizationContext 时,我的行为令人困惑。 我的大部分程序代码都使用自定义 SynchronizationContext,它只是将 SendO
我正在尝试了解 SynchronizationContext 和 friend 。如果我在例如开始时设置自定义同步上下文控制台应用程序。在什么情况下当前同步上下文将与我的异步操作一起流动?Task 和
我想了解更多关于 SynchronizationContext 的信息,所以我制作了这个简单的控制台应用程序: private static void Main() { var sc = ne
我不知道如何获取给定 Thread 的 SynchronizationContext: Thread uiThread = UIConfiguration.UIThread; Synchronizat
如何比较 SynchronizationContext?似乎同一个 Dispatcher 在使用 BeginInvoke 时可以创建不同的 SynchronizationContext。当我深入研究两
在Programming C#一书中,它有一些关于SynchronizationContext的示例代码。 : SynchronizationContext originalContext = Syn
对于 WinForms 和 WPF,我使用 SynchronizationContext 作为同步到 GUI 线程的方法。最近我遇到了旧式异步回调的问题: private void Button
我有以下代码: [TestMethod] public void StartWorkInFirstThread() { if (SynchronizationContext.Current =
SynchronizationContext 有一个名为 IsWaitNotificationRequired 的属性.出于其目的,docs有话要说: Determines if wait notif
说,我有以下代码: IPrincipal capturedPrincipal = Thread.CurrentPrincipal; myseq.AsParallel().Select(x => {
这是一个非常基本的问题,我想是的,但是我找不到任何明确的答案。 SynchronizationContext.Post()线程安全吗? 我有一个成员变量,它保存主线程的上下文,并且从多个线程中调用_c
SynchronizationContext.Current 在主线程上为 null,我很难弄清楚这一点。 static class Program { /// //
我正在创建 SynchronizationContext 的 STA 版本以用于 Windows Workflow 4.0。我想知道在发布回调时如何处理异常。 SynchronizationConte
简而言之,我已经实现了一个派生自 SynchronizationContext 的类,以便 GUI 应用程序可以轻松地使用在 GUI 线程以外的线程上引发的事件。我非常感谢对我的实现的评论。具体来说,
我有两个线程,一个是主线程,另一个是我创建的线程来做一些工作。我不明白当我从另一个线程调用 originalContext.Post(主线程的 SyncronizationContext)时会发生什么
我是一名优秀的程序员,十分优秀!