С# Channel Writer при закрытииC#

Место общения программистов C#
Anonymous
С# Channel Writer при закрытии

Сообщение Anonymous »

Я использую каналы C# в важной среде производительности (использую в качестве буфера кадра камеры). Насколько я тестировал, это самый быстрый вариант сделать это.
У меня есть небольшие сомнения относительно того, как закрыть канал.
У меня есть поток производителя, который добавляет элементы в канал, но если я откажусь от подписки на событие, я хочу закрыть канал, чтобы освободить ресурсы и удалить пользовательскую задачу.
Ключевым моментом здесь является то, как закрыть канал без исключений, когда другой поток надо написать на канале.

Код: Выделить всё

private event EventHandler _frameSetEvent;
public event EventHandler FrameSetEvent
{
add
{
StartBmpFrameBuffer();
_frameSetEvent += value;
}
remove
{
_frameSetEvent -= value;
_frameBuffer.CloseBuffer(); //Channel Complete
}
}
Я могу проверить перед добавлением, но на самом деле я не знаю, как проверка if повлияет на производительность.

Код: Выделить всё

public async Task AddItemAsync(T item)
{
if (_bufferRunning)
await _mainChannel.Writer.WriteAsync(item);
}
Вот мой код, который нужно добавить. Я думаю, что, возможно, в предложениях после if закрытие буфера может прийти из другого потока и привести к сбою добавления (если убрать проверку добавления)

Код: Выделить всё

private async Task AddCamFrameSet2BmpBuffer(CvCameraFrameSetEvtArgs camFrameSet)
{
if (_frameSetEvent != null)
{
if (_frameBuffer == null)
return;

//Some code (not too long) (maybe 1-2 ms)
await _frameBuffer.AddItemAsync(camVisionFrameSet);
}
}
Я спросил, потому что, возможно, есть лучший и эффективный способ закрыть канал без проблем с продюсером.

Подробнее здесь: https://stackoverflow.com/questions/788 ... hen-closed

Вернуться в «C#»