Каково различие между SynchronizationContext. Отправьте и SynchronizationContext. Сообщение?

Благодаря хорошей работе Jeremy Miller в Функциональном программировании Для Повседневной Разработки.NET у меня есть рабочий исполнитель команды, который делает все, что я хочу это к (сделайте тяжелый подъем на пуле потоков, передайте обратно результаты или ошибки к контексту синхронизации, и даже отправьте продвижение назад к контексту синхронизации), но я не могу объяснить, почему это использует SynchronizationContext. Отправьте от пула потоков и Синхронизации. Сообщение от Func переданный в метод, который делает тяжелый подъем. Я прочитал документацию, несколько раз, но я просто не могу получить смысл пищеварительного тракта для того, каково различие. Что является мной предполагаемый добраться от того, что каждого называют Send и каждого называют Post? Я распознаюсь, волшебство находится в факте Send "запускает синхронный запрос" и Post "запускает асинхронный запрос", но оба запроса прибывают из пула потоков и должны быть отправлены/отправлены назад в поток UI.

Кто-то может объяснить различие, даже если это - просто мнемоническое устройство, которое сообщает мне, когда выбрать один по другому?

В случае, если это имеет значение, это - мой тестовый код, где я использую Post передавать прогресс обратно UI:

private Action _ExecuteCommand
                (SynchronizationContext context
                 , Action progress
                 , Action 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 command, Action error)
{
    ThreadPool.QueueUserWorkItem(o =>
     {
         try
         {
             Action continuation = command();
             _Context.Send(s => continuation());
         }
         catch (Exception e)
         {
             _Context.Send(s => error(e));
         }
     });
}

27
задан Gennady Vanin Геннадий Ванин 16 April 2013 в 14:32
поделиться

1 ответ

Отправить - синхронно: дождаться ответа (или выполнить действие)

После - асинхронно: отказаться и продолжить

Итак, ваш пример использует правильные методы в нужные моменты. Нет необходимости останавливать цикл for до завершения обновления хода выполнения (наоборот).
И Execute действительно хочет дождаться завершения действия, иначе обработка исключений не имеет смысла.

30
ответ дан 28 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: