[英]Starting, Stopping A Thread
我不確定線程如何工作。
這是我的代碼。 單擊發送按鈕后:
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),具有一個div加載,使用戶無法按屏幕上的任何鍵:
protected void loadingScreen()
{
loading.Visible = true;
}
現在正在發送郵件,但加載屏幕(div)變得不可見。 我究竟做錯了什么?
在編寫ASP.NET與富客戶端應用程序時,必須重新考慮。 簡而言之(實際上確實很短),Web瀏覽器(客戶端)將請求發送到服務器。 服務器處理該請求(該部分是您后面的代碼),然后將結果返回到Web瀏覽器。
當您在背后的代碼中顯示DIV時,請做一些工作,然后再次將其隱藏,只有結果會到達Web瀏覽器。
有多種方法可以實現所需的光學效果,但是您必須首先了解ASP.NET的生命周期。 例如,從這里開始。
我認為您在計算巨大任務時需要一個可響應的應用程序。 在WinForms中,您必須要小心,因為如果要更改某些UI(如Label中的Text),則必須同步兩個線程。 (UI線程和Thread1)如果運行的是.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;
}
跨線程操作異常警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.