Подскажите пожалуйста нужен ли lock в этом коде, если я собираюсь использовать его в Parallel.ForEach?
Пример кода с lock:
private IEnumerable<(Byte[] part_bytes, Int32 part_number)> GetPartsFile(FileStream file_stream)
{
file_stream.Seek(offset: 0, origin: SeekOrigin.Begin);
for (Int32 index = 0, part_number = 0; index < file_stream.Length; index += DefaultCopyBufferSize, part_number++)
{
lock (this)
{
Byte[] bytes = new Byte[DefaultCopyBufferSize];
Int32 readed_bytes = file_stream.Read(array: bytes, offset: index, count: DefaultCopyBufferSize);
if (readed_bytes < DefaultCopyBufferSize)
{
Byte[] end_bytes = new Byte[readed_bytes];
Buffer.BlockCopy(src: bytes, srcOffset: 0, dst: end_bytes, dstOffset: 0, count: readed_bytes);
yield return (end_bytes, part_number);
}
else
{
yield return (bytes, part_number);
}
}
}
}
Пример использования в Parallel.ForEach:
Parallel.ForEach(
source: GetPartsFile(file_stream: zip_file),
body: tuple =>
{
//тут ещё какие то действия
});
Ответ
Именно для работы метода Parallel.ForEach оператор lock в этом коде не нужен.
Параметр source - источник - выполняется в одном потоке. А вот body - тело - может выполняться в нескольких потоках (а может и в одном).
Отмечу, что блокировака на this является опасной. Если кто-либо ещё возьмёт лок на этот же объект этого класса, то это может привести к дедлоку.
Комментариев нет:
Отправить комментарий