В своем приложении я использую ActionBlock
из библиотеки Dataflow для отправки предупреждений по электронной почте с помощью SmtpClient.SendAsync()
, который не блокирует вызывающий поток (ActionBlock
получает данные от BufferBlock
, а блоки связываются вместе с помощью bufferBlock.LinkTo(actionBlock)
). Однако этот метод выдаст InvalidOperationException
, если выполняется другой вызов .SendAsync()
.
Согласно MSDN документации, есть public event SendCompletedEventHandler SendCompleted
, который возникает, когда операция отправки завершается.
Как мне убедиться, что гонка между потоками (или Tasks
), порожденными ActionBlock
, не приведет к броску InvalidOperationException
?
Одна мысль, которая у меня есть до сих пор, состоит в том, чтобы добавить в мой класс (который отправляет электронные письма) приватную блокировку вокруг вызова SendAsync()
и приватную функцию, которая будет назначена событию SendCompleted
. Когда поток достигает SendAsync()
, он получает блокировку, а когда возникает событие, приватная функция снимает блокировку, позволяя другим потокам получить блокировку и продолжить работу.