【发布时间】:2015-05-06 23:26:32
【问题描述】:
感谢 Jeremy Miller 在Functional Programming For Everyday .NET Development 中的出色工作,我有一个工作命令执行器,它可以完成我想要它做的所有事情(对线程池进行繁重的工作,将结果或错误发送回同步上下文,甚至发布进度回到同步上下文),但我无法解释为什么它使用来自线程池的SynchronizationContext.Send 和来自Func 的Synchronization.Post 传递到执行繁重工作的方法中。我已多次阅读文档,但我无法直观地了解其中的区别。我应该从一个叫做Send 和一个叫做Post 的事实中得到什么?我觉得神奇在于Send“启动一个同步请求”和Post“启动一个异步请求”,但这两个请求都来自线程池并且需要发送/回传到 UI 线程。
有人可以解释其中的区别吗,即使它只是一个让我知道何时选择一个而不是另一个的助记符?
如果重要,这是我的测试代码,我使用Post 将进度发送回 UI:
private Action _ExecuteCommand
(SynchronizationContext context
, Action<int, int> progress
, Action<int, int> after)
{
int count = 3;
int accumulatedValue = 0;
int threadId = Thread.CurrentThread.ManagedThreadId;
for (int i = 0; i < count; i++)
{
Thread.Sleep(1000);
context.Post(delegate { progress(i + 1, threadId); });
accumulatedValue += i;
}
return () => after(threadId, accumulatedValue);
}
_ExecuteCommand 方法作为下面的 command 参数传入,大部分来自原始文章,该文章使用 Send 将完成和错误消息发送回 UI:
public void Execute(Func<Action> command, Action<Exception> error)
{
ThreadPool.QueueUserWorkItem(o =>
{
try
{
Action continuation = command();
_Context.Send(s => continuation());
}
catch (Exception e)
{
_Context.Send(s => error(e));
}
});
}
【问题讨论】:
-
它们的名字真的很糟糕。
标签: c# multithreading threadpool conceptual synchronizationcontext