我有一個 Windows 表單程式。在主表單中,我有一個標簽,我會在其中更新進度。我使用以下代碼來執行我的操作:
Thread workThread = new Thread(delegate ()
{
for (int i = 1; i < bytes.Length; i )
{
SliderOverBytesAndDoProcessing();
}
});
workThread.Start();
該函式SliderOverBytesAndDoProcessing()執行我讀取 4 個位元組并在更多位元組上執行一些操作的操作。我對 200MB 檔案的每 4 個位元組執行此操作(讀取 4 個位元組處理某些內容并繼續移動)。一切正常,直到我決定報告我的進展。以下是我如何進行更新:
Thread workThread = new Thread(delegate ()
{
for (int i = 1; i < bytes.Length; i )
{
Lbl.Invoke((Action)delegate { Lbl.Text = "Processing " (ii / 1048576) "/" (bytes.Length / 1048576); }
SliderOverBytesAndDoProcessing();
}
});
workThread.Start();
如果我添加那一行,程式就會變得太慢。我的意思是程式在沒有這條線的情況下運行大約幾分鐘,但使用這條線大約需要 1.5 小時。此外,如果我這樣做,在其他一些操作中,我最終會陷入無限回圈。如何在不遇到此問題的情況下從其他執行緒報告我的進度以形成執行緒。
謝謝。
uj5u.com熱心網友回復:
它很慢,因為您在每個位元組上都向 UI 執行緒分派,即使進度訊息似乎只關心兆位元組。因此,您將標簽更改為相同的值超過一百萬次。
考慮
var totalMb = bytes.Length / 1024 / 1024;
var lastMb = -1;
for (int i = 1; i < bytes.Length; i ) {
var currentMb = i / 1024 / 1024;
if (currentMb > lastMb) {
Lbl.Invoke(() => { Lbl.Text = $"Processing {currentMb}/{totalMb} MiB" });
lastMb = currentMb;
}
SliderOverBytesAndDoProcessing();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513763.html
標籤:C#多线程表现表格
上一篇:任何執行緒中的例外為何以及如何使Android中的整個應用程式崩潰
下一篇:快速應用程式中的作業執行緒
