Благодаря хорошей работе 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));
}
});
}
Отправить - синхронно: дождаться ответа (или выполнить действие)
После - асинхронно: отказаться и продолжить
Итак, ваш пример использует правильные методы в нужные моменты. Нет необходимости останавливать цикл for до завершения обновления хода выполнения (наоборот).
И Execute действительно хочет дождаться завершения действия, иначе обработка исключений не имеет смысла.