Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net MVC3中的多线程,代码优先_C#_Asp.net_Multithreading_Asp.net Mvc 3_Entity Framework - Fatal编程技术网

C# ASP.net MVC3中的多线程,代码优先

C# ASP.net MVC3中的多线程,代码优先,c#,asp.net,multithreading,asp.net-mvc-3,entity-framework,C#,Asp.net,Multithreading,Asp.net Mvc 3,Entity Framework,我一直在为我的应用程序寻找多线程解决方案,但在尝试时不断出现随机的NullReferenceException错误,而不是连续运行每一个线程并且一切顺利 我所做的是计算从一个地方到另一个地方的旅程,然后计算回程。回程计算只需使用相同的过程,只需切换出发和目的地 在带有实体框架的ASP.net MVC3应用程序中使用多线程执行此操作听起来可行吗?我看过一些文章,其中EF似乎存在问题,但这些听起来似乎只是在页面上共享DBContext时才会出现问题,而我在需要访问数据库的所有区域都使用了语句。有人在

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

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

在带有实体框架的ASP.net MVC3应用程序中使用多线程执行此操作听起来可行吗?我看过一些文章,其中EF似乎存在问题,但这些听起来似乎只是在页面上共享DBContext时才会出现问题,而我在需要访问数据库的所有区域都使用了语句。有人在这里有经验吗

到目前为止,我掌握的基本相关代码如下:

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();
}
谢谢

“这听起来可行吗…” 当然可以

易于实施。。。。。也许不是

threadt1=新线程(ThreadMethod1)

是在.NET4+框架中进行多线程处理的一种过时但不一定被弃用的方法。从您发布的内容来看,没有任何迹象表明您不能使用任务。任务工厂是第三方物流中管理任务的更现代的方式,但我个人发现它有一些怪癖。如果我是你,我会尝试这样做:

   Task T = new Task(() =>
                {
                   BuildJourney(true);
                });
                Task T2 = T.ContinueWith((antecedent) =>
                {
                     BuildJourney(false);
                });
这将确保T2仅在T1返回时运行。不过,正如Ladislav所说,buildTravel方法可能不是线程安全的。这将至少使您在确定线程失败的位置上更进一步。您可能需要研究适当的异步和多线程调试。它比简单的F5稍微复杂一些。pluralsight和code project等网站都有关于调试和编写.net线程编程的非常好的教程


你有一个很好的开始。祝你好运

你的
buildTravel
方法看起来怎么样?它很大-太大了,无法在这里发布,因为它包含很多其他函数和计算!处理大约需要7-10秒,这就是我希望它们同时运行的原因。它包含几个数据库调用、几个计算,并返回一个viewmodels的通用列表。但是在这种情况下,如果我们不知道您的调用可以共享哪些资源,我们几乎无法帮助您。是的,我很感激。我必须将代码发布到外部的某个地方——在这里的代码块中,它太多了,无法理解。现在,我承认我对线程的理解不是很好,但我假设你能够使它成为一个完全独立的新线程,即它们不共享任何资源。你知道这是否可能吗?是的,这是可能的。“不共享任何资源”是关键部分——它们可以以线程安全(只读、锁定、不依赖状态)的方式共享资源。我越是了解所发生的事情,就越觉得BuildJourney类不能运行多线程。至少有一些变化。如果您一次只想在主线程之外运行一个BuildTourney实例,那么上面的代码可以工作。您可能需要重构buildTravel。而且,一个方法越复杂,线程安全的可能性就越小。事实上,我认为你完全正确。从您发布的MSDN库链接判断,我所有进程中都有相当多的东西不是线程安全的,这就是我在线程中运行它时遇到的奇怪错误的原因。我想我需要重构,但我几乎要开始这个项目了——我只是想让它更快,所以无论是现在重构还是在我们上线后重构,我今晚可能会选择喝杯啤酒!谢谢你的回答,肖恩,非常有帮助。只是数据量太大了,我用分析器把时间从最初的一分半降到了7-10秒左右,所以我做得不错。我使用ajax和局部视图,以便在算法完成每个部分时显示数据,但最好在10秒内完成这两个功能。不过,我可以把它留给“第二阶段修正案”!绝对是个好主意。有一些nuget Lint包可能会有更大的帮助。您的数据是否来自数据库?如果是什么样的?您有能力对数据库进行任何改进吗?这是sql server—数据库调用很快,因为它在任何地方都需要索引,但所需的处理会增加时间。不过,我会检查一下Lint包,这可能会有进一步的帮助。再次感谢