2015-08-13 2 views
2

Я пытаюсь реализовать программу, которая позволяет максимум десяти человек одновременно выбрать объект, скажем, чашку или автомобиль. Это означает, что когда один из них закончен, есть свободное место для другого человека, чтобы выбрать объект. Максимальное время, затрачиваемое на сбор, составляет 5 секунд. Я попытался использовать множество задач, но это не работает, поскольку сборщик находится на разных машинах. Я мог бы обновлять базу данных в любое время, когда один человек выбирает объект, а затем проверяет значение из базы данных, но я думаю, что это плохая идея. Как я могу контролировать эти потоки или выборы?C#, управляющий количеством одновременных потоков, работающих

Мне нужно контролировать/отслеживать максимальное количество потоков, независимо от того, где выполняется выбор объекта.

Спасибо

+0

Что об использовании пула потоков? –

ответ

-2

Это очень трудно понять, что спрашивается ..

Но я думаю, что вы хотите контролировать свои темы?

В этом случае вы можете приостановить поток, который может использоваться для синхронизации потоков. Однако это может протекать в тупиковые ситуации.

+0

Благодарим вас за ответ. Я просто отредактировал отредактированный вопрос и добавил некоторую информацию. Мне нужно контролировать/отслеживать максимальное количество потоков, независимо от того, где выполняется выбор объекта. – Rual

3

A 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() сразу. Как только человек закончит, следующий начнет.

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.

Смежные вопросы