В чем разница между SynchronizationContext.Send и SynchronizationContext.Post?C#

Место общения программистов C#
Ответить
Anonymous
 В чем разница между SynchronizationContext.Send и SynchronizationContext.Post?

Сообщение Anonymous »

Благодаря хорошей работе Джереми Миллера в области функционального программирования для повседневной разработки .NET у меня есть рабочий исполнитель команд, который делает все, что я хочу (выполняет тяжелую работу с пулом потоков, отправляет результаты или ошибки обратно в контекст синхронизации и даже отправляет прогресс обратно в контекст синхронизации), но я не могу объяснить, почему он использует SynchronizationContext.Send из пула потоков и Synchronization.Post from the Func, передаваемый в метод, который это делает. тяжелый подъем. Я читал документацию несколько раз, но просто не могу понять, в чем разница. Что я должен получить от того, что один называется «Отправить», а другой — «Отправить»? Я чувствую, что волшебство заключается в том, что Send "запускает синхронный запрос", а Post "запускает асинхронный запрос", но оба запроса поступают из пула потоков, и их необходимо отправить/отправить обратно в поток пользовательского интерфейса.

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

Если это важно, это мой тестовый код, в котором я использую Post для отправки прогресса обратно в пользовательский интерфейс:

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 передается как параметр команды ниже, в основном из исходной статьи, которая использует Send для отправки сообщения о завершении и ошибке обратно в пользовательский интерфейс:

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));
}
});
}


Подробнее здесь: https://stackoverflow.com/questions/247 ... nizationco
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»