![]() |
1
1
您应该从一个通用的生产者-消费者队列开始并使用它。在队列中实现这一点并不是一个好主意,因为这会阻止您使用信号量来向线程发送信号(或者,您的队列中可能有公共信号量,但这是 坏主意)。 一旦线程A将单个工作项排队,它就必须发出信号通知线程B。当线程B处理完所有项时,它应该发出信号通知其他所有人它已经完成。您的主线程应该在等待第二个信号量知道所有事情都完成了。 [编辑]
所以,在您的情况下,创建邮件的类需要启动
然后将这两个实例传递给
要使用它,需要让类实现这两个接口:
最棒的是:
|
![]() |
2
2
如果有.Net 4.0,请使用
如果你有一个早期的.Net,那么升级(即,我懒得解释如何实现已经为你做过的事情) 编辑: |
![]() |
3
1
我写了一个简单的例子,对我来说很好,应该适合你的场景。如果用户正在运行取决于运行变量是如何设置的,但是您可以轻松地将其修改为更复杂的条件,比如“如果没有邮件存在,但有人说我应该等待更多”。
|
![]() |
4
1
你想要的可以用条件变量来完成。我将编写一个伪代码示例,应该不会太难实现。 一根线有如下线索:
而另一条线有这样的线索
所以如果你没有收到任何信息,就推一条死亡信息。当所有的信息都被处理过的时候。
调用notifyOne()时wait()返回,然后队列有消息要发送。在大多数框架中,conditionvariable已经拥有锁,您可能需要在.NET中自己添加lock语句。 |
![]() |
5
0
我会用一个线程来完成整个过程。即生成邮件正文并发送。只是因为生成邮件正文不需要时间,但是发送电子邮件需要时间。
因此,可以在每个线程执行其任务的地方启动多个线程(在数量上保持上限)。如果您使用sat处理作业(数据)的集合,那么您可以并行化数据(即将数据分割成与系统上的核心数匹配的块,例如作业的快照(线程)。 使用任务将使所有这一切变得更加简单,无论你走哪条路,即2个线程发送一封电子邮件或一个线程完成整个工作,但使用多个线程并行完成多个工作。 |
|
Roy · SQL C#:结果未返回任何内容。读取() 7 年前 |
![]() |
Pablo · 如何在Regex.replace中仅替换捕获组? 9 年前 |
![]() |
rudimenter · 为什么以下代码编译和执行成功? 11 年前 |
![]() |
Rachel · 是否有任何原因在该代码块的List<T>中找不到现有项? 11 年前 |
![]() |
oshirowanen · 动态超级链接 11 年前 |
![]() |
sab669 · SharpSVN不迭代所有子目录和文件 11 年前 |
![]() |
ForeverWintr · Excel中的奇怪行为。工作表。单元格[行,列] 12 年前 |