启动、停止线程

本文关键字:线程 启动 | 更新日期: 2023-09-27 18:24:17

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

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

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(称为loading),其中有一个loadingdiv,它禁止用户在屏幕上按下任何东西:

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

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

启动、停止线程

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

当你在代码后台显示一个DIV时,做一些工作,然后再次隐藏它,只有结果会到达web浏览器。

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

我认为在计算巨大任务时,您需要一个可响应的应用程序。在WinForms中,你必须小心,因为如果你想更改一些UI,比如标签中的文本,你必须同步两个线程。(UI线程和线程1)如果你运行的是.NET 4.0,你应该使用任务类,因为在那里你不需要同步,你也可以使用匿名方法。

protected void SendSMS()
{
    loading.Visible = true;
    var task = Task.Factory.StartNew(()=>{//code that actually sends the required Mail}
    task.Wait();
    loading.Visible = false;
}

实际上,加载很快就会显示出来,然后隐藏起来。Join在启用Div后立即返回,然后发送电子邮件,Div再次被禁用。发送电子邮件和禁用发生在同一个线程中。

为什么使用threadB?您只能使用threadA:进行操作

protected void SendSMS()

//这里的一些验证

loading.Visible = false;
//code that actually sends the required Mail
loading.Visible = false;

}

跨线程操作异常的警告。