C# 方法的并行访问

C# 方法的并行访问,c#,thread-safety,parallel-processing,C#,Thread Safety,Parallel Processing,(那里的任何人) 我正在研究车辆跟踪系统:- 我有n辆公共汽车 b1t1(早上7点开始,晚上7点停止) bt2(上午8点开始,晚上8点停止)和bt3(上午9点开始,晚上9点停止) ,其中t是总线的开始时间 现在我的列表中有这样的总线。 现在,对于列表中的每个总线,我拾取一个busobject并传递给方法MyMethod(总线bt);我想要的是,我想要将b1、b2、b3传递给MyMethod(总线bt),每个总线的b1——开始自己对MyMethod(总线bt)的处理 然后对于b2——开始自己处理M

(那里的任何人)

我正在研究车辆跟踪系统:- 我有n辆公共汽车
b1t1(早上7点开始,晚上7点停止)
bt2(上午8点开始,晚上8点停止)和bt3(上午9点开始,晚上9点停止)
,其中t是总线的开始时间

现在我的列表中有这样的总线。
现在,对于列表中的每个总线,我拾取一个busobject并传递给方法MyMethod(总线bt);我想要的是,我想要将b1、b2、b3传递给MyMethod(总线bt),每个总线的b1——开始自己对MyMethod(总线bt)的处理
然后对于b2——开始自己处理MyMethod(总线bt)
然后对于b3----开始自己处理MyMethod(总线bt)
所有b1 b2 b3都应该并行启动自己的处理(必须是线程安全的——我不知道使用线程安全这个词是否合适)…

---我尝试使用线程,但线程无法并行访问该方法


更多解释 我只有一个方法,将在一个循环中将总线对象逐个传递给MyMethod(BusBT)。。。但我希望线程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;
    }
但是给出了一个错误:-
“SMSThreadEntryPointFunction没有重载匹配委托system.thread.WaitCallback”

(那里的任何一个)

您需要为您的方法使用一个,并且每个方法都需要在它自己的线程中运行。因此,您必须将每个方法分配给它自己的backgroundworker。您需要确保可以由多线程同时访问的任何资源都被适当地锁定,这样就可以保证线程安全


线程安全意味着多个线程可以使用一个资源,导致数据损坏或创建争用条件和/或死锁。

您发现线程不能并行执行的原因如下:

ThreadPool.QueueUserWorkItem(state => MyMethod(bus1));
ThreadPool.QueueUserWorkItem(state => MyMethod(bus2));
...
threads[indexOfCurrentActiveBusAndItsPathInfoObj].Join();
这会导致主线程在主线程继续之前等待当前总线线程完成。您可能希望将Join()调用移到启动线程的循环之外,或者一起消除它。从注释开始,这样你就可以看到它的效果

让多线程代码正常工作可能是一项挑战;如果你对正在发生的事情没有很好的理解,这可能是不可能的。我同意达林的建议,让你通读一遍


最后,看起来您要做的是运行模拟。一种更简单的方法是设置按模拟时间排序的事件优先级队列。然后,主循环简单地将第一个事件从队列中拉出,将模拟时间更新为事件的时间,并执行该事件。事件处理程序可以通过将将来的事件推送到队列中来安排它们。通过搜索有关“离散事件模拟”的信息,您可以找到有关此想法的更多信息。

关于您迄今为止尝试的内容,有没有任何示例代码无法解释预期结果和实际结果?您能否详细说明新代码给您带来同步问题的意思?
SMSThreadEntryPointFunction
的方法签名是什么?新代码给了您一个同步问题--意味着我的一个线程正在打开数据库连接,而另一个线程正在关闭它(我有许多类似的问题)签名是--public void SMSThreadEntryPointFunction(ActiveBusAndItsPathInfo ActiveBusAndItsPathInfoObj)hi,Tnx的回复,但我只有一个方法,将通过一个循环的总线对象传递给我的方法(总线bt)一个接一个。。。但我希望线程t1/t2…tn应该并行访问此方法…因为当b1的线程同时运行时,b2的线程应该运行…所以在循环中,每次都必须创建backgroundworker,这将生成一个新线程。然后,所有方法调用都将独立运行,确保连接backgroundworker的已完成事件,在工作完成时通知您我不希望任何线程等待其他线程…它们应该独立工作…这正是我的示例所做的。它并行地启动MyMethod的执行,将不同的总线实例传递给它。也许你应该多读一点关于.NET框架中多线程的知识。这是一个好的开始:嗨,它正在给出同步问题。嗨..添加了有问题的新代码请找到新代码…我是否必须锁定我的方法…SMSThreadEntryPointFunction(ActiveBusAndItsPathInfoObj)
ThreadPool.QueueUserWorkItem(state => MyMethod(bus1));
ThreadPool.QueueUserWorkItem(state => MyMethod(bus2));
...
threads[indexOfCurrentActiveBusAndItsPathInfoObj].Join();