[英]C# Threading Issue in a web application
我有一個Web應用程序,在頁面后面的代碼中,我有一個按鈕單擊事件。
protected void btnUpload_Click(object sender, EventArgs e)
{
TimerEvent TE = new TimerEvent();
TE.TimerEvents();
Server.Transfer("~/Jobs.aspx");
}
我有一個調用TimerEvents()的方法,可能需要10到15秒鍾才能將控件返回到服務器傳輸。 因此,我希望在方法調用的同時同時執行服務器傳輸線。
我在這里嘗試線程化:
TimerEvent TE = new TimerEvent();
Thread t = new Thread(TE.TimerEvents);
t.IsBackground = true;
t.Start();
Server.Transfer("~/Jobs.aspx");
但是,直到方法完成,才進行傳輸。 我該如何實現?
這種設計並不理想。 即使您做對了,由於混合了多線程代碼和Server.Transfer()調用,您仍有可能遇到麻煩。
在ASP.NET應用程序中還存在有關多線程的問題。
我建議您重新設計您的應用程序,以使您擁有某種將長時間運行的任務排隊的隊列。 然后,您可以使用一項服務來逐一處理隊列中的任務。
現在,您可以通過網絡應用程序執行以下操作:
將長時間運行的TimerEvents任務排隊到外部服務。
呼叫Server.Transfer()
在新頁面(“〜/ Jobs.aspx”)上,在需要時調用外部服務以獲取結果。
如果經常以類似的方式重復該過程,那么您將所謂的“應用程序事件”為何不在Global.asax(應用程序)文件中的單個線程上建立一個進程。 您可以使用FileWatcher類監視目錄並按順序處理文件,或者在到達文件時在其自己的線程中為每個文件啟動另一個進程,可以保留狀態和任何結果,並可能使用AJAX定時將其公開給客戶端。打回來。
記住要在從Global.asax文件調用的方法中正確處理所有異常,因為它們可以使整個appDomain崩潰。
最簡單的操作:我將立即返回並說“您的文件已上傳”,然后在“ jobs.aspx”頁面上進行自動刷新,並將每個作業的狀態顯示為“正在處理”,直到完成為止”
假設jobs.aspx是您正在處理的作業的列表...並且“自動刷新”不太麻煩:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.