SynchronizationContext.Send和SynchronizationContext.Post有什么区别?

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

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

如果重要,这是我的测试代码 ,我使用Post将进度发送回UI:

 private Action _ExecuteCommand (SynchronizationContext context , Action progress , Action after) { int count = 3; int accumulatedValue = 0; int threadId = Thread.CurrentThread.ManagedThreadId; for (int i = 0; i  after(threadId, accumulatedValue); } 

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

 public void Execute(Func command, Action error) { ThreadPool.QueueUserWorkItem(o => { try { Action continuation = command(); _Context.Send(s => continuation()); } catch (Exception e) { _Context.Send(s => error(e)); } }); } 

发送 – 同步:等待回答(或动作完成)

后异步:下拉并继续

因此,您的示例在正确的时刻使用正确的方法。 在进度更新完成之前,无需停止for循环(相反)。
并且Execute确实要等待Action完成,否则exception处理没有任何意义。