首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SynchronizationContext.Send和SynchronizationContext.Post有什么区别?

SynchronizationContext.Send和SynchronizationContext.Post有什么区别?
EN

Stack Overflow用户
提问于 2010-03-18 20:15:53
回答 1查看 17.3K关注 0票数 35

由于Jeremy在面向日常.NET开发的函数编程中的出色工作,我有一个工作命令执行器,它可以执行我想做的任何事情(在线程池上执行繁重的工作,将结果或错误发送回同步上下文,甚至将进度发回同步上下文),但我无法解释为什么它使用线程池中的SynchronizationContext.Send,以及传递给执行繁重任务的方法的Func中的Synchronization.Post。我已经读过几次文档了,但是我只是不知道区别是什么。我从一个叫做Send,一个叫做Post的事实中得到了什么呢?我感觉到神奇之处在于Send“启动同步请求”和Post“启动请求”,但这两个请求都来自线程池,需要发送/回发回UI线程。

有人能解释一下这种区别吗,即使它只是一个记忆装置,让我知道什么时候该选择一个而不是另一个?

如果有关系,这是我的测试代码,在这里我使用Post将进度发送回UI:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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));
         }
     });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-18 20:34:15

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

后异步:放下并继续

因此,您的示例在正确的时刻使用了正确的方法。在进度更新完成之前,不需要停止for-循环(相反)。

而Execute则希望等待操作完成,否则异常处理就没有意义了。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2473073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档