параллельный доступ к методу

(Все там)

Я работаю над системой слежения за транспортными средствами: у меня есть n автобусов, скажем, b1t1(start at 7 am and stop at 7 pm) bt2 (start at 8 am and stop at 8 pm) and bt3 (start at 9 am and stop at 9 pm) ,where t is start time of a bus

теперь у меня есть такие автобусы в списке.
теперь для каждой шины в списке я беру один объект автобуса и передаю методу MyMethod (bus bt); я хочу, я хочу передать b1, b2, b3 в MyMethod (шина bt) и и для каждой шины скажем b1--запустите собственную обработку MyMethod(bus bt)
и затем для b2 --запустите свою собственную обработку MyMethod(bus bt)
и затем для b3- --- запустить собственную обработку MyMethod(bus bt)
все b1 b2 b3 должны начать собственную обработку параллельно (должно быть потокобезопасным --- уместно ли использовать слово потокобезопасный, я не знаю) ....

--- Я пытался использовать поток, но поток не обращается к методу параллельно...


более подробное объяснение, у меня есть только один метод, и я буду передавать объект шины в цикле MyMethod(bus bt) один за другим... но я хочу, чтобы поток t1/t2...tn имел доступ к этому методу параллельно...потому что, когда поток для b1 выполняется одновременно с потоком для b2.

enter c public bool SchedulerEntryPointFunction()
    {
        Console.WriteLine("Scheduler is  initiated !\n\n");
        bool bSuccess = false;

        Console.WriteLine("Got ActiveBuses and coresponding Paths!\n\n");
        List<ActiveBusAndItsPathInfo> ActiveBusAndItsPathInfoList = BusinessLayer.GetActiveBusAndItsPathInfoList();
        if (ActiveBusAndItsPathInfoList != null)
        {
            Thread[] threads = new Thread[ActiveBusAndItsPathInfoList.Count];
            while (true)
            {
                foreach (ActiveBusAndItsPathInfo ActiveBusAndItsPathInfoObj in ActiveBusAndItsPathInfoList)
                {
                    //Get curent time
                    //compare for time difference less than equal to 5 mins
                    if (ActiveBusAndItsPathInfoObj.isSMSThreadActive == false)
                    {
                        // Console.WriteLine("SMS Thread about to initiate!\n\n");

                        DateTime CurrentTime = System.DateTime.Now;
                        // TimeSpan CurrentTimespan = (TimeSpan)CurrentTime;
                        DateTime Bustime = Convert.ToDateTime(ActiveBusAndItsPathInfoObj.busObj.Timing);
                        //TimeSpan BustimeTimes = Bustime.TimeOfDay;
                        TimeSpan tsa = Bustime - CurrentTime;

                        //  if(tsa.TotalMinutes > 0 && tsa.TotalMinutes < 5)
                        {
                            ActiveBusAndItsPathInfoObj.isSMSThreadActive = true;

                            ***ThreadStart starter = delegate { SMSThreadEntryPointFunction(ActiveBusAndItsPathInfoObj); };
                            Thread t = new Thread(starter);
                           **//  t.Start();
                            int indexOfCurrentActiveBusAndItsPathInfoObj = ActiveBusAndItsPathInfoList.IndexOf(ActiveBusAndItsPathInfoObj);
                            threads[indexOfCurrentActiveBusAndItsPathInfoObj] = new Thread(starter);
                            threads[indexOfCurrentActiveBusAndItsPathInfoObj].Start();
                            threads[indexOfCurrentActiveBusAndItsPathInfoObj].Join();***
                        }
                    }
                }**


            }
        }

        return bSuccess;
    }

ода здесь


Новый код: - Все еще возникает проблема с синхронизацией...

  foreach (ActiveBusAndItsPathInfo ActiveBusAndItsPathInfoObj in ActiveBusAndItsPathInfoList)
                       {
                        //Get curent time
                        //compare for time difference less than equal to 5 mins
                        if (ActiveBusAndItsPathInfoObj.isSMSThreadActive == false)
                        {

                            DateTime CurrentTime = System.DateTime.Now;
                           DateTime Bustime = Convert.ToDateTime(ActiveBusAndItsPathInfoObj.busObj.Timing);
                            TimeSpan tsa = Bustime - CurrentTime;

                            if(tsa.TotalMinutes > 0 && tsa.TotalMinutes < 5)
                            {
                                ActiveBusAndItsPathInfoObj.isSMSThreadActive = true;

                                ThreadPool.QueueUserWorkItem(state => SMSThreadEntryPointFunction(ActiveBusAndItsPathInfoObj)

                        }
                    }


                }
            }

            return bSuccess;
        }

мне нужно заблокировать мой метод ... SMSThreadEntryPointFunction (ActiveBusAndItsPathInfoObj)


в настоящее время я пытаюсь

 ThreadPool.QueueUserWorkItem(new WaitCallback(SMSThreadEntryPointFunction), (object)ActiveBusAndItsPathInfoObj);

но выдает ошибку:-"No overload for SMSThreadEntryPointFunction matches delegate system.thread.WaitCallback"

(Все там)


person hrishi    schedule 01.02.2010    source источник
comment
Какой-нибудь пример кода того, что вы пробовали до сих пор, не работал, объясняя ожидаемые и фактические результаты?   -  person Darin Dimitrov    schedule 01.02.2010
comment
Не могли бы вы уточнить, что вы имеете в виду, говоря, что новый код создает проблему синхронизации? Какова сигнатура метода SMSThreadEntryPointFunction?   -  person Timo Kosig    schedule 02.02.2010
comment
новый код дает вам проблему синхронизации - означает, что мой один поток открывает соединение с базой данных, а другой поток закрывает его (у меня много подобных проблем).   -  person hrishi    schedule 02.02.2010


Ответы (3)


Причина, по которой вы обнаружите, что ваши потоки не выполняются параллельно, заключается в строке:

threads[indexOfCurrentActiveBusAndItsPathInfoObj].Join();

Это заставляет основной поток ждать завершения текущего потока шины, прежде чем основной поток продолжит работу. Вы можете переместить вызов Join() за пределы цикла, который запускает ваши потоки, или исключить его целиком. Начните с того, что закомментируйте его, чтобы вы могли увидеть эффект, который он оказывает.

Добиться правильной работы многопоточного кода может быть непросто; и, вероятно, невозможно, если у вас нет хорошего понимания того, что происходит. Я согласен с предложением Дарина прочитать руководство.

Наконец, похоже, что вы пытаетесь запустить симуляцию. Гораздо более простой подход к этому — настроить приоритетную очередь событий, упорядоченную по времени симуляции. Затем основной цикл просто извлекает первое событие из очереди, обновляет смоделированное время до времени события и выполняет событие. Обработчики событий могут планировать будущие события, помещая их в очередь. Вы можете узнать больше об этой идее, выполнив поиск информации о «моделировании дискретных событий».

person Dave    schedule 01.02.2010

Для вашего метода и каждый метод должен выполняться в своем собственном потоке. Таким образом, вам придется назначить каждому методу собственный фоновый рабочий процесс. Вы должны убедиться, что любые ресурсы, к которым могут обращаться несколько потоков одновременно, должным образом заблокированы, чтобы все было потокобезопасным.

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

person Tony The Lion    schedule 01.02.2010
comment
привет, Tnx для твоего ответа, но у меня есть только один метод, и я буду передавать объект шины в цикле MyMethod (bus bt) один за другим ... но я хочу, чтобы поток t1 / t2 ... tn должен получить доступ к этому методу в параллельно... потому что, когда поток для b1 выполняется одновременно, поток для b2 должен работать... - person hrishi; 01.02.2010
comment
Таким образом, в вашем цикле вам придется каждый раз создавать фонового рабочего, который каждый раз будет порождать новый поток. Затем все ваши вызовы методов будут выполняться независимо, убедитесь, что вы подключили события Completed вашего фонового рабочего, чтобы уведомить вас о завершении работы. - person Tony The Lion; 01.02.2010

person    schedule
comment
Я не хочу, чтобы какой-либо поток ждал другого потока... они должны работать независимо... - person hrishi; 01.02.2010
comment
Это именно то, что делает мой пример. Он запускает выполнение MyMethod параллельно, передавая ему другой экземпляр шины. Возможно, вам следует подробнее прочитать о многопоточности в среде .NET. Вот хорошее начало: yoda.arachsys.com/csharp/threads - person Darin Dimitrov; 01.02.2010
comment
Привет, это дает синхронную проблему. - person hrishi; 02.02.2010
comment
привет .. добавлен новый код, о котором идет речь, пожалуйста, найдите новый код ... мне нужно заблокировать мой метод ... SMSThreadEntryPointFunction (ActiveBusAndItsPathInfoObj) - person hrishi; 02.02.2010