У меня есть небольшие сомнения относительно того, как закрыть канал.
У меня есть поток производителя, который добавляет элементы в канал, но если я откажусь от подписки на событие, я хочу закрыть канал, чтобы освободить ресурсы и удалить пользовательскую задачу.
Ключевым моментом здесь является то, как закрыть канал без исключений, когда другой поток надо написать на канале.
Код: Выделить всё
private event EventHandler _frameSetEvent;
public event EventHandler FrameSetEvent
{
add
{
StartBmpFrameBuffer();
_frameSetEvent += value;
}
remove
{
_frameSetEvent -= value;
_frameBuffer.CloseBuffer(); //Channel Complete
}
}
Код: Выделить всё
public async Task AddItemAsync(T item)
{
if (_bufferRunning)
await _mainChannel.Writer.WriteAsync(item);
}
Код: Выделить всё
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
Мобильная версия