启动,停止线程

时间:2013-07-22 09:20:19

标签: c# asp.net multithreading

我不确定线程​​是如何工作的。

这是我的代码。点击发送按钮后:

protected void BtnSend_Click(object sender, EventArgs e)
{
    Thread threadA = new Thread(SendSMS);
    threadA.Start();
}

protected void SendSMS()
{
    //some validations here
    Thread threadB = new Thread(loadingScreen);
    threadB.Start();
    threadB.Join();
    //code that actually sends the required Mail
    threadB.Stop();
    loading.Visible = false;
}

threadB正在调用这个方法,它基本上是一个div(称为加载),带有一个加载div,禁止用户在屏幕上按任何东西:

protected void loadingScreen()
{
    loading.Visible = true;
}

现在正在发送邮件,但加载屏幕(div)未显示。 我做错了什么?

4 个答案:

答案 0 :(得分:4)

当您编写ASP.NET与富客户端应用程序时,您必须重新考虑。简而言之(非常简短)Web浏览器(客户端)向服务器发送请求。服务器处理该请求(该部分是您的代码),并将结果返回给Web浏览器。

当您在代码隐藏中显示DIV时,执行一些操作,然后再次隐藏它,只有结果才会到达Web浏览器。

有多种方法可以实现您想要的光学效果,但您必须首先了解ASP.NET的生命周期。例如,开始here

答案 1 :(得分:2)

我认为您在计算巨大任务时需要一个可响应的应用程序。 在WinForms中你必须要小心,因为如果你想改变像Label中的Text那样的UI,你必须同步两个线程。 (UI-Thread和Thread1) 如果您运行的是.NET 4.0,则应该使用Task-Class,因为您不需要同步,也可以使用匿名方法。

protected void SendSMS()
{
    loading.Visible = true;

    var task = Task.Factory.StartNew(()=>{//code that actually sends the required Mail}

    task.Wait();
    loading.Visible = false;
}

答案 2 :(得分:0)

实际上,加载变得可见,然后快速隐藏。一旦启用Div,立即加入返回,然后发送电子邮件,再次禁用Div。发送电子邮件和禁用发生在同一个帖子中。

答案 3 :(得分:0)

为什么要使用线程?您只能使用threadA:

进行操作
protected void SendSMS()

{

//这里有一些验证

loading.Visible = false;

//code that actually sends the required Mail

loading.Visible = false;

}

警告跨线程操作异常。