параллельный доступ к методу - PullRequest
3 голосов
/ 01 февраля 2010

(Любой Там)

Я работаю над системой слежения за автотранспортными средствами: - У меня количество автобусов говорят 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

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

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


больше объяснений у меня есть только один метод, и я буду передавать объект bus в цикле 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"

(Любой там)

Ответы [ 3 ]

1 голос
/ 01 февраля 2010
ThreadPool.QueueUserWorkItem(state => MyMethod(bus1));
ThreadPool.QueueUserWorkItem(state => MyMethod(bus2));
...
1 голос
/ 02 февраля 2010

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

threads[indexOfCurrentActiveBusAndItsPathInfoObj].Join();

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

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

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

0 голосов
/ 01 февраля 2010

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

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

...