具有Code-First EF的ASP.net MVC3中的多线程

时间:2012-08-23 14:42:45

标签: c# asp.net multithreading asp.net-mvc-3 entity-framework

一直在为我的应用程序寻找一个多线程解决方案,但在我尝试时不断出现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();
}

由于

1 个答案:

答案 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线程编程的非常好的教程。

你在这里有一个很好的开始。祝你好运!