【发布时间】:2012-08-23 14:42:44
【问题描述】:
一直在为我的应用程序寻找多线程解决方案,但在尝试时不断收到随机的 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();
}
谢谢
【问题讨论】:
-
您的
BuildJourney方法看起来如何? -
它太大了,因为它包含许多其他函数和计算,所以无法在此处发布!处理大约需要 7-10 秒,这就是我希望它们同时运行的原因。它包含几个数据库调用、几个计算并返回一个通用的视图模型列表。
-
但在这种情况下,如果我们不知道您的通话可以共享哪些资源,我们将无法为您提供帮助。
-
是的,我很感激。我将不得不将代码发布到外部某个地方 - 在这里的代码块中能够理解的内容太多了。现在,我承认我对线程的理解不是很好,但我认为你能够做到这一点,所以一个新线程是完全独立的,即它们不共享任何资源。你知道这是否可能吗?
-
是的,有可能。 “不共享任何资源”是关键部分——它们可以以线程安全(只读、锁定、不依赖状态)的方式共享资源。
标签: c# asp.net multithreading asp.net-mvc-3 entity-framework