SynchronizationContext

SynchronizationContext

Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        3年前关闭。
                                                                                            
                
        
我一直在研究SynchronizationContext,而这些文章(Understanding SynchronizationContextExecutionContext vs SynchronizationContext)确实为我提供了帮助,但是-当然-还有很多问题。

我想实现自己的从基类继承的SynchronizationContext类,以便可以在任何Task的上下文中使用它(用于自定义消息循环,限制,跟踪等);像这样的东西:

public class SyncContext : System.Threading.SynchronizationContext
{

    public SyncContext() : base()
    {
    }

    public override void Send(Threading.SendOrPostCallback d, object state)
    {
        base.Send(d, state);
    }

    public override void Post(Threading.SendOrPostCallback d, object state)
    {
        base.Post(d, state);
    }
}


虽然base.Send似乎可以完成预期的工作(同步执行回调),但是base.Post似乎没有任何作用。关于Post方法,Microsoft声明:


  在派生类中重写时,调度异步消息
  同步上下文。


我猜不能指责基类没有实现异步机制,但是调用base.Post时会发生什么,或者如何看待正确/更好的实现呢?我的一般方法是否已经引起误解?

感谢您的努力!

后续问题:实现自定义TaskScheduler也许是更好的方法-也许TaskScheduler that uses a dedicated thread本质上是我所需要的?

最佳答案

如果您有自己的消息循环,则需要在SynchronizationContext中捕获它,因此,当另一个线程调用SynchronizationContext.Post时,必须将回调操作添加到该消息循环中。

作为ExecutionContext的一部分,SynchronizationContext是“流”的一部分,但并非总是如此,因此您需要注意代码中的流(如果可能)。

Post方法的默认实现是对工作线程(使用ILSpy捕获)上的操作进行排队:

public virtual void Post(SendOrPostCallback d, object state)
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(d.Invoke), state);
}


但是最大的问题是为什么您需要自己的SynchronizationContext?如果只是为了好玩-很好,否则您的工作做得非常高级,也许其他现有的更简单的机制也可以解决问题。

关于c# - 如何在自定义SynchronizationContext中正确覆盖Post方法? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35576595/

10-11 17:28