2013-06-03 45 views
2

我有一个庞大的数据运行,这需要很多时间,所以认为线程可能很快为我完成这项工作。Asp.net - 多线程C#

我做的:从ASP.NET前端和处理调用SQL存储过程发生存在,它需要近30个小时。

我需要的是:我已经将数据分成不同的批次,并为每个批次创建了相应的SP。现在我需要所有的SP在同一时间点击一下按钮。

请帮忙!

我用下面的代码,但它似乎并行运行。

protected void Button3_Click(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 

     t1.Start(); 
     t2.Start(); 

     t1.Join(); 
     t2.Join(); 

    } 
    void Method1() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      Response.Write("hello1"+i); 
      Response.Write("<br>"); 
     } 
    } 

    void Method2() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      Response.Write("hello2" + i); 

     } 
    } 
+4

ASP.Net管道在单线程中运行,一旦完成最终渲染就死掉。基本上,这意味着页面在服务器上保持活动状态,但是为每个请求实例化页面,用于生成生成的html,然后发布。继续之前,请阅读文档以了解此模型。有解决方案(signalR + out-of-iis应用程序),但你应该知道asp.net如何在一般情况下工作。 –

+0

当你调用't1.Join'时,你告诉当前线程要等到t1完成,这就是为什么代码没有并行运行的原因。 – stuartd

+0

将20,000个事情写入ASP.NET页面?你不想分页吗? –

回答

5

您可能不想直接在ASP.NET中执行此操作,原因很多,例如工作进程的执行时间有限。

还要注意的是SqlConnection等也有自己的时间限制。

你真正应该做的是排队通过队列的工作要做(IPC使用或其他数据库表等),并有像Windows服务或外部进程中计划任务拿起和过程。

地狱,你甚至可以在SQL Server中启动一项工作,并直接完成这项工作。

+0

感谢@Lloyd的回复。您能否给我推荐一些博客文章或任何文章,以获得您给我的解决方案? –

1
  • 线程犯规神奇地加快你的进程。
  • 如果你不知道你在做什么,服务器端线程通常不是一个好主意。
  • 的SQL Server可能会超时为30小时:)

30小时工作的Asp.net是不是要走的路。这是一个很大的过程,你不应该在Asp.net中处理它。作为替代方案,您可能需要编写一个Windows服务。将你的参数传递给它(也许使用msmq或某种消息传递系统)执行你的过程并发送进度到Web应用程序,用signalR或Ajax拉来显示它。

1

Narendran,从这里开始:

http://www.albahari.com/threading/

这是最好的线程教程,我已经在网上看到和相应的书也很不错。

确保你花足够的时间去通过整个教程(我已经做到了,相信我,它值得的!)。

如上所述,在这种情况下使用线程类的Join方法会破坏使用线程的目的。而不是使用联合使用锁(请参阅上述教程中的基本Synchoronization)以确保线程同步。

同样如前所述,在执行多线程之前,直接在SQL Server上运行这些存储过程并将它们一起运行。如果它们还需要30个小时才能执行,那么使用线程将不会有任何帮助。如果你看不到30个小时,那么你可能会从多线程中受益。