簡體   English   中英

如何在循環中保持C#Windows窗體響應?

[英]How do I keep my C# Windows Form Responsive while it churns loops?

我有這個龐大的嵌套循環場景,它調用數據庫並向Basecamp API發出HTTP請求。 起初它是一個網絡應用程序,但運行應用程序花了很多時間,因此用戶(計費部門)經常會提前退出或抱怨,因為它需要很長時間沒有反饋,也沒有辦法取消它。 我想讓它更具響應性並給它一個取消按鈕以及一個實時日志,我也想讓它更具可控性。 我把它放在表單中,這樣他們可以控制它的每個實例,並有一個取消按鈕和一個實時日志。

然而,當我把它全部用表單按鈕,多行文本框來替換響應和錯誤日志時,我無法得到任何工作! 如果按下取消,我在循環中添加了檢查以突破。 但是,我甚至無法單擊取消,當我.Text.Insert然后.Update()時,多行TextBox將不會實時更新。 整個應用程序只是坐在那里旋轉...我如何讓它響應,在循環過程中接受按鈕點擊,並實時更新多行TextBox

注意:事情編譯得很好,我可以逐步完成它,它寫入日志文件就好了,所以我可以告訴它在我的表單通過查看該日志文件凍結的事實之后工作。

這是我試圖更新多行TextBox的代碼:

TimeSyncLog.Text.Insert(TimeSyncLog.Text.Length, "(((" + clientCode + ")))\n");

這是我的循環突破的代碼:

if(CancelPressed)
{
    TimeSyncLog.Text.Insert(TimeSyncLog.Text.Length,"\n\nSYNC STOPPED BY USER.");
    break;
}

但是我永遠不能單擊“取消”按鈕來切換該boolean因為窗口顯示“無響應”...

您不應該在UI線程上消耗業務邏輯。 您可以將BackgroundWorker類用於這類事情。 它還支持取消和進度報告。

你可以在這里閱讀它。

UI線程應該只有UI相關的更改。 與您的問題半無關,這里有一個很棒的線程教程

BackgroundWorker是一個使用線程池的優秀類,盡管在線程時有很多選項和要考慮的事項。 如果要取消該線程,可以在GUI類中嵌套一個事件,以便工作者可以訂閱它,以處理按下“取消”按鈕的事件。 也許這不是最有效的方式,但我相信這里的其他人可以推薦一些替代路線。 希望這可以幫助。

暫無
暫無

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

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