C#控制同时运行的线程数

时间:2015-08-13 20:21:34

标签: c# multithreading

我正在尝试实施一个程序,允许最多十个人同时选择一个杯子或汽车。这意味着,当其中一个完成时,另一个人可以自由选择一个物体。人们可以花费的最长时间是5秒。我试图使用一系列任务,但这不起作用,因为选择器在不同的机器上。我可以随时更新数据库,一个人选择一个对象,然后检查数据库中的值,但我认为,这是一个坏主意。我怎么能控制那些线程或选择?

我需要控制/跟踪运行的最大线程数,而不管对象的选择在何处完成。

谢谢

3 个答案:

答案 0 :(得分:4)

这听起来不像是线程问题,而是更多的服务器/客户端对象管理器。您可以使用许多方向,但一个简单的解决方案是使用管理每个对象的服务。

/* Common interface each object shares */
public interface IObject { ... }
/* Sharable Object implementing IObject */
public class Cup : IObject { ... }

/* This class would be exposed via WCF or Remoting */
public class ObjectSharer : IObjectSharer {
    enum ObjectType { Cup, Car }
    IObject GetObject(ObjectType ObjType) { ... }
    ReturnObj(IObject) { ... }
}

您必须填写实施内容,但希望这可以为您提供有关如何解决此类问题的一些想法。

在GetObject方法中,jwde建议使用信号量是处理资源管理的好方法,将对象限制为10。

答案 1 :(得分:3)

Semaphore是用于限制资源并发访问次数的惯用数据结构。

示例:

public static class foo
{
    private static Semaphore _resources = new Semaphore(_limit, _limit);
    private const _limit = 10;
    public void Pick()
    {
        _resources.WaitOne();
        doWork();
        _resources.Release();
    }
}

现在只有10个线程可以doWork()一次。一旦完成,下一个将开始。

答案 2 :(得分:-2)

很难理解被问到的是什么..

但我认为你想控制你的线程?

在这种情况下,您可以挂起一个可用于同步线程的线程。然而,这可能会导致死锁。