4

一直在为我的应用程序寻找多线程解决方案,但是NullReferenceException当我尝试时不断出现随机错误,而不是当我连续运行每个错误并且一切顺利时。

我正在做的是计算从一个地方到另一个地方的旅程,然后计算回程。回程计算只是使用相同的过程,只是换了出发地和目的地。

在带有实体框架的 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();
}

谢谢

4

1 回答 1

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 线程编程的教程。

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

于 2012-08-23T16:14:47.620 回答