感谢杰里米·米勒在
Functional Programming For Everyday .NET Development
,我有一个工作命令执行器,它可以做任何我想做的事情(在线程池上做繁重的工作,将结果或错误发送回同步上下文,甚至将进度发送回同步上下文),但我无法解释它为什么使用
SynchronizationContext.Send
从线程池和
Synchronization.Post
从
Func
传给做重担的方法。我已经读了好几遍文档,但我就是无法理解其中的区别。我从一个被称为
Send
其中一个叫做
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
下面的参数,大部分来自原始文章,它使用
发送
要将完成和错误消息发送回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));
}
});
}