感谢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);
}
下面的command
参数通常是从原来的文章中传入的_ExecuteCommand
方法,使用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));
}
});
}