我不确定线程是如何工作的。
这是我的代码。点击发送按钮后:
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)未显示。 我做错了什么?
答案 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;
}
警告跨线程操作异常。