如何管理等待工作的工作线程?

时间:2010-09-29 09:56:42

标签: c# .net multithreading .net-2.0

我有一个执行以下操作的程序:

  1. 调用webservice(对同一Web服务有很多调用)

  2. 处理结果1.

  3. 在数据库

  4. 中插入2.的结果

    所以我觉得做一些多线程应该会更好。我想我可以这样做:

    • 一个主线是主线(让我们称之为A)

    • 它会创建一个调用webservices的线程(让我们称之为W)

    • 当W有一些结果时,它会将其发送给A(或A检测到W有一些东西)

    • A将结果发送到某个计算线程(让我们称之为C)

    • 当C有一些结果时会将其发送给A(或A检测到C有一些东西)

    • A将结果发送到某个数据库线程(让我们称之为D)

    所以有时C或D会等待工作。

    使用这种技术,我将能够为每个任务设置线程编号。

    请告诉我如何做到这一点,也许是否有任何模式。 编辑:我添加了“some”而不是“a”,所以我会为一些耗时的过程创建许多线程,也许只有一个是最快的。

3 个答案:

答案 0 :(得分:4)

听起来我可以使用生产者/消费者模式。使用.NET 4,实现起来非常简单。启动一些Task并使用BlockingCollection<T>作为任务之间的缓冲区。查看this post了解详情。

答案 1 :(得分:2)

在.net中你有一个线程池。

当你释放一个线程时,它实际上并没有被关闭,它只是回到线程池中。当您打开一个新线程时,您将从线程池中获取一个线程。

如果它们长时间不使用,则线程池将关闭它们。

答案 2 :(得分:0)

我会启动两个计时器,它们将在不同的ThreadPool线程上触发它们的事件处理程序。第一个计时器的事件处理程序将检查Web服务的数据,如果找到一些,则将其写入Queue<T>,然后返回休眠状态直到下一个间隔。

第二个计时器的事件处理程序读取队列并更新数据库,然后休眠直到下一个间隔。两个事件处理程序都应该对队列lock进行包装访问以管理并发。

具有独立间隔的独立定时器将允许您在数据可用时将其插入数据库所需的时间进行解耦,并将队列充当缓冲区。由于通用队列可以动态增长,即使数据库暂时不可用,您也会获得喘息空间。第二个事件处理程序甚至可以生成多个线程以同时插入多个记录或镜像数据库。事件处理程序还可以将更新发布到日志文件或用户界面,以帮助您监视活动。