С# 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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