如何在asp.net中使用线程?

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

这是我正在做的样本:

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"; } 

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

页面加载也不需要5秒。

ps我知道asp网的工作方式不同,但我不知道我做错了什么。

在呈现和返回页面之前,没有什么可以等待你的线程完成 – 这就是错误的。

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

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

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

编辑:虽然这解决了问题中的问题,但请按照Vano的回答推荐使用PageAsyncTask 。

如果要异步执行函数,则需要执行以下步骤:

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

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

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

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

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

在最新的.NET版本中查看异步/等待。 它使事情变得更容易和可预测