Я думаю, что все операции BeginXyz
, которые реализуют стандартную модель асинхронного программирования, запускают обратный вызов в потоке пула потоков, что делает приложение автоматически многопоточным.
Однако вы можете достичь однопоточной модели асинхронного программирования, синхронизируя все операции через единый поток GUI, который поддерживается для приложений Windows, использующих Control.Invoke
или, в более общем случае, SynchronizationContext
.
Каждый вызов BeginXyz
должен быть переписан следующим образом:
// Start asynchronous operation here (1)
var originalContext = SynchronizationContext.Current;
obj.BeginFoo(ar =>
// Switch to the original thread
originalContext.Post(ignored => {
var res = obj.EndFoo();
// Continue here (2)
}));
Код, помеченный как (2), будет продолжать работать в том же потоке, что и код в (1), поэтому вы будете использовать поток пула потоков только для пересылки обратной передачи обратно в исходный (единственный) поток.
В качестве дополнительного примечания, это напрямую поддерживается асинхронными рабочими процессами в F # и может использоваться для довольно элегантного стиля программирования графического интерфейса , как описано здесь . Я не знаю node.js
, но я полагаю, что вы также можете быть удивлены асинхронными рабочими процессами F # , поскольку они действительно хороши для асинхронного / основанного на событиях / ... стиля программирования: -)