2013-01-12 67 views
1

我有网页表单应用程序。在一种形式中,我有几个功能。哪些同步调用需要一些时间。所以我需要在不同的线程中调用它们。如何在asp.net中使用线程?

这是我在做什么样:

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页面。

另外Page加载不需要5秒。

p.s.我知道ASP网络的作品不同,但我不知道我做错了什么。

+1

我强烈建议您使用任务和异步/等待关键字。 – Rick

回答

7

在页面呈现并返回之前没有什么东西等待你的线程完成 - 这就是错误。

要将Page_Load()函数结束(或者在页面渲染生命周期中的最新的,可能的点),添加:

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

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

编辑:虽然这可以解决问题中的问题,但请按照Vano的回答推荐看看PageAsyncTask

+0

Thansk它的工作原理。 – user1972654

+0

尽管这会让你的代码正常工作,但我建议你按照Vano对这个问题的回答所建议的方式来查看PageAsyncTask。 –

2

如果要异步执行功能,需要执行以下步骤:

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

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

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

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

0

你开始新的线程,但不要等待它们完成。因此,由于thread.start()是非阻塞的,因此您的page_load将运行至完成。

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

+0

你能举个例子吗? – user1972654