【问题标题】:Asp.net -- Multithreading in C#Asp.net -- C# 中的多线程
【发布时间】:2013-06-03 21:37:29
【问题描述】:

我有大量数据要运行,这需要花费大量时间,所以我认为线程可能会很快为我完成这项工作。

我的工作:从 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);

       }
   }

【问题讨论】:

  • ASP.Net 管道在单个线程中运行,并且在最终渲染完成后终止。基本上,这意味着页面确实在服务器上保持活动状态,但是页面会针对每个请求进行实例化,用于生成结果 html,然后被释放。在继续之前,请阅读文档以了解此模型。有解决方案(signalR + out-of-iis application),但你应该知道asp.net之前一般是如何工作的。
  • 当您调用t1.Join 时,您是在告诉当前线程等到 t1 完成,这就是代码没有并行运行的原因
  • 将 20,000 个内容写入 ASP.NET 页面?你不想分页什么的吗?
  • @stuartd:但是当我省略 t1.join 行时,它会给出以下错误尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
  • @MarkSchultheiss:不,我不想打印 10000 行。它只是一个尝试检查异步线程是否正常工作的示例

标签: c# asp.net multithreading


【解决方案1】:

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

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

您真正应该做的是将要做的工作排队(使用 IPC 或其他数据库表等),并让计划任务中的 Windows 服务或外部进程之类的东西通过队列提取和处理。

该死,您甚至可以在 SQL Server 中启动一项工作,并让其直接完成工作。

【讨论】:

  • 感谢@Lloyd 的回复。您能否针对您给我的解决方案推荐一些博客文章或任何文章?
【解决方案2】:
  • 线程不会神奇地加快您的进程。
  • 如果您不知道自己在做什么,服务器端线程通常不是一个好主意。
  • Sql server 可能会超时 30 小时 :)

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

【讨论】:

    【解决方案3】:

    纳伦德兰,从这里开始:

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

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

    确保您花足够的时间完成整个教程(我已经完成了,相信我,值得!)。

    如上所述,在这种情况下使用线程类的 Join 方法违背了使用线程的目的。而不是使用连接使用锁(参见上述教程中的基本同步)来确保线程同步。

    同样如前所述,在进行多线程之前,直接在 SQL Server 上运行这些存储过程,并一起运行。如果它们仍然需要 30 个小时才能执行,那么使用 Threading 将无济于事。如果您看到少于 30 小时,那么您可能会从多线程中受益。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多