启动、停止线程
本文关键字:线程 启动 | 更新日期: 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;
}
跨线程操作异常的警告。