一直在为我的应用程序寻找一个多线程解决方案,但在我尝试时不断出现NullReferenceException
错误,而不是我连续运行每个错误并且一切顺利。
我正在做的是计算从一个地方到另一个地方的旅程,然后计算回程。回程计算只是使用相同的过程,只有离开和目的地切换。
在具有Entity Framework的ASP.net MVC3应用程序中使用多线程执行此操作听起来是否可行?我已经看过一些文章似乎有EF的问题,但这些听起来只是在页面上共享DBContexts时只是一个问题,而我在我需要访问数据库的所有区域使用了Using语句。任何人都有这方面的经验吗?
我到目前为止的基本相关代码是:
var outboundJourneyTask = Task.Factory.StartNew(() => BuildJourney(true));
var returnJourneyTask = Task.Factory.StartNew(() => BuildJourney(false));
Task.WaitAll(outboundJourneyTask, returnJourneyTask);
我希望每个任务都重新开始,但由于空引用异常,我相信在第二个线程中,它试图使用第一个内置的数组,当它找不到时某些元素,它会引发错误。
这听起来有可能吗?有人知道更好的方法吗?
编辑:我正在尝试一种不同的线程方法(见下文)但是我的数组发生了一些奇怪的事情 - 以不同方式循环它们并抛出错误Thread t1 = new Thread(ThreadMethod1);
t1.Start();
Thread t2 = new Thread(ThreadMethod2);
t2.Start();
void ThreadMethod1(object state)
{
BuildJourney(false);
ManualResetEvent mre = (ManualResetEvent)state;
mre.Set();
}
void ThreadMethod2(object state)
{
BuildJourney(true);
ManualResetEvent mre = (ManualResetEvent)state;
mre.Set();
}
由于
答案 0 :(得分:4)
“这听起来可行吗?” 是的,当然。
易于实施.....也许不是。
Thread t1 = new Thread(ThreadMethod1)
是在.net 4+框架中进行多线程处理的过时但不一定弃用的方法。根据您发布的内容,没有任何迹象表明您无法使用任务。任务工厂是在TPL中管理任务的更现代的方式,但我发现它有一些个人的怪癖。如果我是你,我会尝试这样做:
Task T = new Task(() =>
{
BuildJourney(true);
});
Task T2 = T.ContinueWith((antecedent) =>
{
BuildJourney(false);
});
这将确保T2仅在T1返回时运行。虽然,正如Ladislav所说,BuildJourney方法可能不是线程安全的。这至少可以让您更进一步确定线程故障的位置。您可能希望调查正确的异步和多线程调试。它比简单的F5稍微复杂一点。像pluralsight和代码项目这样的网站有关于调试和编写.net线程编程的非常好的教程。
你在这里有一个很好的开始。祝你好运!