如何在asp.net中使用线程

本文关键字:线程 net asp | 更新日期: 2023-09-27 17:52:11

我有web表单应用程序。在一种形式上,我有几个函数。这是同步的,需要一些时间。所以我需要在不同的线程中调用它们。

这是我正在做的示例:

    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网络的工作方式不同,但我不知道我做错了什么。

如何在asp.net中使用线程

在页面呈现和返回之前没有等待线程完成-这就是问题所在。

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

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

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

编辑:虽然这解决了问题中的问题,但请查看Vano的答案推荐的PageAsyncTask

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

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

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

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

RegisterAsyncTask函数在同步上下文中注册你的函数。. NET将异步运行您的函数,并等待所有已注册的函数完成,然后继续页面处理。

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

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