簡體   English   中英

C#在繁重的工作期間保持UI響應的最佳方法

[英]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。
  • 服務器開始在非請求線程中處理該作業,或者由專用於該任務的另一台服務器拾取並處理該作業。 線程完成后,它將相應地更新作業的狀態。

后來...

  • 用戶想知道他們的過程狀態。 他們定期使用其JobId調用status終結點。 服務器回復一些狀態信息以顯示用戶。

后來...

  • 作業狀態更改為“完成”后,用戶可以使用其JobId調用result端點以獲取最終文件。

繁重的處理應在非UI,非請求線程中完成,以免其他用戶受到影響。

使用這種方法,您甚至可以完全另一台服務器上進行處理。 Web服務器所做的所有事情就是允許用戶創建和查詢處理作業。

絕對學習如何進行線程化...如果稍微重寫一下,幾乎可以一次處理所有這些文件。也不難學習:

https://www.dotnetperls.com/threadstart

您也可以嘗試Application.DoEvents(); 間隔,但這是可怕的做法。

如果您使用線程路由,則可以通過以下方法從線程訪問ui:

如何從另一個線程更新GUI?

那是線程的唯一復雜之處在於您無法訪問gui線程。

如果過於復雜,請查看“后台工作者”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM