![](/img/trans.png)
[英]C# Best approach for a responsive UI during SQL query using COM interop
[英]C# Best way to keep UI responsive during heavy workload
我們的網絡服務器會即時生成一個文件供下載。 這需要花費大約兩分鍾的時間,因為它需要1000個單詞模板,通過郵件合並它們,然后將它們轉換為pdf,然后從這1000個文件中提取一個zip文件。 該處理使Web服務器在此期間無法執行任何其他操作,這是一個問題,因為它為客戶端托管23個子域,並且他們注意到該服務器處於凍結狀態。
如何強制UI線程完成某些工作? 我一直在看Thread.Sleep和Thread.Yield,但也許我沒有正確實現它們。 我對線程的概念很陌生。
在Web服務器上開始處理時,生成“作業ID”並將其存儲在某處(例如數據庫)。 添加一個端點,以便客戶端可以查詢作業的狀態。 處理完成后,用戶可以使用作業ID來獲取結果文件。 它是這樣的:
start
端點,該端點返回JobId。 后來...
status
終結點。 服務器回復一些狀態信息以顯示用戶。 后來...
result
端點以獲取最終文件。 繁重的處理應在非UI,非請求線程中完成,以免其他用戶受到影響。
使用這種方法,您甚至可以完全在另一台服務器上進行處理。 Web服務器所做的所有事情就是允許用戶創建和查詢處理作業。
絕對學習如何進行線程化...如果稍微重寫一下,幾乎可以一次處理所有這些文件。也不難學習:
https://www.dotnetperls.com/threadstart
您也可以嘗試Application.DoEvents(); 間隔,但這是可怕的做法。
如果您使用線程路由,則可以通過以下方法從線程訪問ui:
那是線程的唯一復雜之處在於您無法訪問gui線程。
如果過於復雜,請查看“后台工作者”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.