Как насчет функции карри? Вы получаете 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
.
Да. Это похоже на различие между городской тюрьмой и дверью. Эти ManualResetEvent
дверь, которая должна быть закрыта (сброс) вручную. Эти AutoResetEvent
городская тюрьма, позволяя одному автомобилю пройти и автоматически закрываясь, прежде чем следующий сможет пройти.
Просто предположите, что эти AutoResetEvent
выполняется WaitOne()
и Reset()
как единственная атомарная операция.
Короткий ответ - да. Наиболее важное различие - то, что AutoResetEvent только позволит одному единственному потоку ожидания продолжаться. ManualResetEvent, с другой стороны, будет продолжать позволять потоки, несколько одновременно даже, продолжаться, пока Вы не скажете ему останавливаться (Сброс он).
Да. Это абсолютно корректно.
Вы видели ManualResetEvent как способ указать на состояние. Что-то находится на (Наборе) или от (Сброса). Возникновение с некоторой продолжительностью. Любой поток, ожидающий того состояния для случая, может продолжиться.
AutoResetEvent более сопоставим с сигналом. Тот стрелял в признак, что что-то произошло. Возникновение без любой продолжительности. Обычно, но не обязательно "что-то", которое произошло, является маленьким и должно быть обработано единственным потоком - следовательно автоматический сброс после того, как единственный поток использовал событие.
Взятый из книги ореховой скорлупы C# 3.0, Joseph Albahari
Поточная обработка в C# - Свободная Электронная книга
А ManualResetEvent является изменением на AutoResetEvent. Это отличается, в котором это автоматически не сбрасывает после того, как поток пропущен на вызове WaitOne, и так функции как логический элемент: вызов Набора открывает логический элемент, позволяя любое количество потоков что WaitOne в логическом элементе через; Сброс вызова закрывает логический элемент, порождение, потенциально, очередь официантов для накопления до его открытого следующего.
можно было моделировать эту функциональность с булевской переменной "gateOpen" поле (объявленный с энергозависимым ключевым словом) в сочетании со "сном вращения" †“неоднократно проверка флага и затем сон в течение короткого периода времени.
ManualResetEvents иногда используются, чтобы сигнализировать, что конкретная операция завершена, или что завершенная инициализация потока и готова выполнить работу.