我正在使用控制台应用程序,我使用多线程。我只是想知道哪个部分必须放在关键部分我的代码是:
.------------------------------------------------- -----------------------------。
公共类SendBusReachSMS
{
public void SchedularEntryPoint()
{
try
{
List<ActiveBusAndItsPathInfo> ActiveBusAndItsPathInfoList = BusinessLayer.GetActiveBusAndItsPathInfoList();
if (ActiveBusAndItsPathInfoList != null)
{
//SMSThreadEntryPoint smsentrypoint = new SMSThreadEntryPoint();
while (true)
{
foreach (ActiveBusAndItsPathInfo ActiveBusAndItsPathInfoObj in ActiveBusAndItsPathInfoList)
{
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)
{
ThreadStart starter = delegate { SMSThreadEntryPointFunction(ActiveBusAndItsPathInfoObj); };
Thread t = new Thread(starter);
t.Start();
t.Join();
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("===========================================");
Console.WriteLine(ex.Message);
Console.WriteLine(ex.InnerException);
Console.WriteLine("===========================================");
}
}
public void SMSThreadEntryPointFunction(ActiveBusAndItsPathInfo objActiveBusAndItsPathInfo)
{
try
{
//mutThrd.WaitOne();
String consoleString = "Thread for " + objActiveBusAndItsPathInfo.busObj.Number + "\t" + " on path " + "\t" + objActiveBusAndItsPathInfo.pathObj.PathId;
Console.WriteLine(consoleString);
TrackingInfo trackingObj = new TrackingInfo();
string strTempBusTime = objActiveBusAndItsPathInfo.busObj.Timing;
while (true)
{
trackingObj = BusinessLayer.get_TrackingInfoForSendingSMS(objActiveBusAndItsPathInfo.busObj.Number);
if (trackingObj.latitude != 0.0 && trackingObj.longitude != 0.0)
{
//calculate distance
double distanceOfCurrentToDestination = 4.45;
TimeSpan CurrentTime = System.DateTime.Now.TimeOfDay;
TimeSpan timeLimit = objActiveBusAndItsPathInfo.sessionInTime - CurrentTime;
if ((distanceOfCurrentToDestination <= 5) && (timeLimit.TotalMinutes <= 5))
{
Console.WriteLine("Message sent to bus number's parents: " + objActiveBusAndItsPathInfo.busObj.Number);
break;
}
}
}
// mutThrd.ReleaseMutex();
}
catch (Exception ex)
{
//throw;
Console.WriteLine("===========================================");
Console.WriteLine(ex.Message);
Console.WriteLine(ex.InnerException);
Console.WriteLine("===========================================");
}
}
}
请帮我多线程。我在.net
中的新主题答案 0 :(得分:0)
如果你想锁定一段代码,以便一次只能有一个线程访问你的代码,那么试试这个:
在你的班级中声明一个对象
public class SendBusReachSMS {
private object _sync;
}
然后在你的线程代码中有这个:
public void SMSThreadEntryPointFunction(ActiveBusAndItsPathInfo objActiveBusAndItsPathInfo)
{
try
{
lock(_sync)
{
// Do Code.....
}
// rest of code.
我们的想法是将主代码包装在lock语句中,该语句将阻塞其他线程,直到当前线程完成为止。
希望这有帮助。
答案 1 :(得分:0)
通常,您必须标识线程之间共享的对象。这显然是objActiveBusAndItsPathInfo
。如果两个线程获取同一对象的实例,则存在潜在问题,并且在第一个线程上修改此共享对象的属性会影响第二个线程的行为。但是看SMSThreadEntryPointFunction
我认为没有这样的危险,假设这个数字被传递给get_TrackingInfoForSendingSMS
作为价值(或者我忽略了某些东西)。