【发布时间】:2015-02-20 18:52:14
【问题描述】:
在我的应用程序中,我正在使用来自 Dataflow 库的 ActionBlock,使用 SmtpClient.SendAsync() 方法发送电子邮件警报,该方法不会阻止调用线程。(ActionBlock 正在从 BufferBlock 获取数据,并阻止使用bufferBlock.LinkTo(actionBlock) 绑定在一起)。但是,如果另一个 .SendAsync() 调用正在进行,此方法将抛出 InvalidOperationException。
根据 MSDN documentation,发送操作完成时会引发 public event SendCompletedEventHandler SendCompleted。
我如何确保ActionBlock 产生的线程(或Tasks)之间的竞争不会导致InvalidOperationException 被抛出?
到目前为止,我的一个想法是在我的班级(发送电子邮件)中添加 SendAsync() 调用和将分配给 SendCompleted 事件的私有函数的私有锁定。当线程到达SendAsync() 时,它获得锁,当事件引发时,私有函数解锁锁,允许其他线程获得锁,并继续。
【问题讨论】:
标签: c# .net multithreading task-parallel-library tpl-dataflow