В чем разница между ManualResetEvent и AutoResetEvent в .NET?

Как насчет функции карри? Вы получаете 11 строк кода Scala:

val md = MessageDigest.getInstance(hashInfo.algorithm)
val input = new FileInputStream("file")
iterateStream(input){ (data, length) => 
    md.update(data, 0, length)
}
md.digest

Функция iterateStream в строке 3, которую вы могли бы добавить в библиотеку:

def iterateStream(input: InputStream)(f: (Array[Byte], Int) => Unit){
    val buffer = new Array[Byte](512)
    var curr = input.read(buffer)
    while(curr != -1){
        f(buffer, curr)
        curr = input.read(buffer)
    }
}

Уродливый дублированный код (где ввод считывается) заканчивается в библиотеке, хорошо протестирован и скрыт от программиста. Я чувствую, что первый блок кода менее сложный, чем решение Iterator.continually.

501
задан Mark Byers 8 November 2011 в 09:08
поделиться

5 ответов

Да. Это похоже на различие между городской тюрьмой и дверью. Эти ManualResetEvent дверь, которая должна быть закрыта (сброс) вручную. Эти AutoResetEvent городская тюрьма, позволяя одному автомобилю пройти и автоматически закрываясь, прежде чем следующий сможет пройти.

874
ответ дан Yves M. 8 November 2011 в 09:08
поделиться

Просто предположите, что эти AutoResetEvent выполняется WaitOne() и Reset() как единственная атомарная операция.

116
ответ дан Michael Damatov 8 November 2011 в 09:08
поделиться

Короткий ответ - да. Наиболее важное различие - то, что AutoResetEvent только позволит одному единственному потоку ожидания продолжаться. ManualResetEvent, с другой стороны, будет продолжать позволять потоки, несколько одновременно даже, продолжаться, пока Вы не скажете ему останавливаться (Сброс он).

52
ответ дан Martin Brown 8 November 2011 в 09:08
поделиться

Да. Это абсолютно корректно.

Вы видели ManualResetEvent как способ указать на состояние. Что-то находится на (Наборе) или от (Сброса). Возникновение с некоторой продолжительностью. Любой поток, ожидающий того состояния для случая, может продолжиться.

AutoResetEvent более сопоставим с сигналом. Тот стрелял в признак, что что-то произошло. Возникновение без любой продолжительности. Обычно, но не обязательно "что-то", которое произошло, является маленьким и должно быть обработано единственным потоком - следовательно автоматический сброс после того, как единственный поток использовал событие.

7
ответ дан Boaz 8 November 2011 в 09:08
поделиться

Взятый из книги ореховой скорлупы C# 3.0, Joseph Albahari

Поточная обработка в C# - Свободная Электронная книга

А ManualResetEvent является изменением на AutoResetEvent. Это отличается, в котором это автоматически не сбрасывает после того, как поток пропущен на вызове WaitOne, и так функции как логический элемент: вызов Набора открывает логический элемент, позволяя любое количество потоков что WaitOne в логическом элементе через; Сброс вызова закрывает логический элемент, порождение, потенциально, очередь официантов для накопления до его открытого следующего.

можно было моделировать эту функциональность с булевской переменной "gateOpen" поле (объявленный с энергозависимым ключевым словом) в сочетании со "сном вращения" †“неоднократно проверка флага и затем сон в течение короткого периода времени.

ManualResetEvents иногда используются, чтобы сигнализировать, что конкретная операция завершена, или что завершенная инициализация потока и готова выполнить работу.

35
ответ дан 8 November 2011 в 09:08
поделиться
Другие вопросы по тегам:

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