Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
3年前关闭。
我一直在研究SynchronizationContext,而这些文章(Understanding SynchronizationContext,ExecutionContext vs SynchronizationContext)确实为我提供了帮助,但是-当然-还有很多问题。
我想实现自己的从基类继承的
虽然
在派生类中重写时,调度异步消息
同步上下文。
我猜不能指责基类没有实现异步机制,但是调用
感谢您的努力!
后续问题:实现自定义
但是最大的问题是为什么您需要自己的SynchronizationContext?如果只是为了好玩-很好,否则您的工作做得非常高级,也许其他现有的更简单的机制也可以解决问题。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
3年前关闭。
我一直在研究SynchronizationContext,而这些文章(Understanding SynchronizationContext,ExecutionContext 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