代码之家  ›  专栏  ›  技术社区  ›  flipdoubt

synchronizationcontext.send和synchronizationcontext.post有什么区别?

  •  26
  • flipdoubt  · 技术社区  · 15 年前

    感谢杰里米·米勒在 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));
             }
         });
    }
    
    1 回复  |  直到 15 年前
        1
  •  29
  •   Henk Holterman    10 年前

    发送-同步:等待应答(或操作完成)

    后异步:放下并继续

    所以你的例子在适当的时候使用了正确的方法。在进度更新完成之前(相反),不需要停止for循环。
    而execute确实希望等待操作完成,否则异常处理没有任何目的。