【问题标题】:How to use threads in asp.net?如何在asp.net中使用线程?
【发布时间】:2013-01-12 17:54:13
【问题描述】:

我有网络表单应用程序。在一种形式上,我有几个功能。这被称为同步并需要一些时间。所以我需要在不同的线程中调用它们。

这是我正在做的示例:

    protected void Page_Load(object sender, EventArgs e)
    {
        Thread t1 = new Thread(new ThreadStart(Function1));
        t1.Start();
        Thread t2 = new Thread(new ThreadStart(Function2));
        t2.Start();
    }

    private void Function1()
    {
        Thread.Sleep(5000);
        lbl1.Text = "Function1 completed";
    }

    private void Function2()
    {
        Thread.Sleep(5000);
        lbl2.Text = "Function2 completed";
    }

如果我调试(设置断点)lbl1.Text = "Function1 completed";lbl2.Text = "Function2 completed"; 被调用,但最终 html 页面上的文本没有改变。

页面加载也不需要 5 秒。

附言我知道 ASP 网络的工作方式不同,但我不知道我做错了什么。

【问题讨论】:

  • 我强烈建议您改用 tasks 和 async / await 关键字。

标签: c# asp.net multithreading c#-4.0


【解决方案1】:

在页面呈现和返回之前,没有任何事情等待您的线程完成 - 这就是问题所在。

在您的 Page_Load() 函数末尾(或在页面呈现生命周期的最晚可能点),添加:

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

另外:您不应该在线程 proc 中更新 lbl1 和 lbl2 - 您应该将结果存储在变量中并在主渲染线程中反映计算值(即一旦 Join 返回)。

编辑:虽然这解决了问题中的问题,但请按照 Vano 的回答建议查看 PageAsyncTask

【讨论】:

  • 虽然这可以让您的代码正常工作,但我建议您按照 Vano 对这个问题的回答所推荐的方式查看 PageAsyncTask。
【解决方案2】:

如果你想异步执行函数,你需要做一些步骤:

1)。您需要设置 Async="true" 页面指令。

<%@ Page Language="C#" Async="true" ... %>

2)。您需要创建PageAsyncTask 对象并使用Page.RegisterAsyncTask() 函数注册它。

RegisterAsyncTask 函数在syncronization context 中注册您的函数,因此 ASP.NET 将异步运行您的函数并等待所有注册函数完成,然后继续页面处理。

【讨论】:

    【解决方案3】:

    您启动新线程,但不要等待它们完成。因此,您的 page_load 运行完成,因为 thread.start() 是非阻塞的。

    查看最新 .NET 版本中的 async/wait。它使事情变得更容易和可预测

    【讨论】:

    • 你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2011-06-17
    • 2022-08-19
    • 2011-10-18
    • 1970-01-01
    • 2023-04-09
    • 2018-11-17
    相关资源
    最近更新 更多