我有网络表单应用程序。在一种形式上,我有一些功能。这被称为同步并需要一些时间。所以我需要在不同的线程中调用它们。
这是我正在做的样本:
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秒。
P.S。我知道asp网络有所不同,但我不知道我做错了什么。
答案 0 :(得分:7)
在呈现和返回页面之前,没有什么东西在等待你的线程完成 - 这就是错误的。
在Page_Load()
函数的末尾(或在页面渲染生命周期的最新点),添加:
t1.Join();
t2.Join();
另外:你不应该在线程proc中更新lbl1和lbl2 - 你应该将结果存储在变量中并反映主渲染线程中的计算值(即一旦Join
返回)。< / p>
编辑:虽然这解决了问题中的问题,但请按照Vano的回答推荐PageAsyncTask。
答案 1 :(得分:2)
如果要异步执行函数,则需要执行以下步骤:
1)。你需要设置Async =“true”页面指令。
<%@ Page Language="C#" Async="true" ... %>
2)。您需要创建PageAsyncTask对象并使用Page.RegisterAsyncTask()函数注册它。
RegisterAsyncTask函数在syncronization context中注册您的函数,因此ASP.NET将异步运行您的函数,并等待所有已注册的函数完成,然后继续页面处理。
答案 2 :(得分:0)
您启动新线程但不要等待它们完成。因此,你的page_load运行完成,因为thread.start()是非阻塞的。
在最新的.NET版本中查看async / wait。它使事情变得更容易和可预测