Является ли асинхронная реализация в С# 4.5 точно такой же, как в F # 2 в том, как используются потоки?
Является ли асинхронным в С# ту же реализацию, что и в F #?
Ответ 1
Они разные. Основное отличие состоит в том, что С# использует стандартный .NET Task<T>
для представления асинхронных вычислений, а F # использует свой собственный тип под названием Async<T>
.
В частности, ключевыми отличиями являются:
-
Асинхронный метод С# создает
Task<T>
, который сразу же запускается (горячая модель задачи), в то время как F # создает вычисление, которое нужно начинать явно (модель генератора). Это означает, что вычисления F # легче компилировать (вы можете писать абстракции более высокого уровня). -
В F # вы также получаете лучший контроль над тем, как начинается вычисление. Вы можете начать вычисление с помощью
Async.Start
, чтобы запустить его в фоновом режиме илиAsync.StartImmediate
, чтобы запустить его в текущем потоке. -
Асинхронные рабочие процессы F # автоматически поддерживают отмену, поэтому вам не нужно проходить
CancellationToken
. -
Возможно, еще одним следствием первой точки является то, что рабочие процессы F # async также поддерживают хвостовую рекурсию, поэтому вы можете писать рекурсивные рабочие процессы (это не сработает на С#, но С# не использует этот стиль программирования)
Я написал более подробную статью по этой теме: Asynchronous С# и F # (II.): Как они отличаются?