由于Jeremy在面向日常.NET开发的函数编程中的出色工作,我有一个工作命令执行器,它可以执行我想做的任何事情(在线程池上执行繁重的工作,将结果或错误发送回同步上下文,甚至将进度发回同步上下文),但我无法解释为什么它使用线程池中的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));
}
});
}发布于 2010-03-18 20:34:15
发送同步:等待应答(或操作完成)
后异步:放下并继续
因此,您的示例在正确的时刻使用了正确的方法。在进度更新完成之前,不需要停止for-循环(相反)。
而Execute则希望等待操作完成,否则异常处理就没有意义了。
https://stackoverflow.com/questions/2473073
复制相似问题