簡體   English   中英

C#WinForms應用程序:停止/中斷Windows窗體應用程序

[英]C# WinForms application: stop / interrupting a Windows Forms application

環境:.net 3.5 WinForms應用程序

我正在尋找一些如何停止/中斷Windows窗體應用程序的想法,例如當“某事”需要太長時間時。 典型的情況是從后端系統讀取大量數據,用戶應能夠立即按下一些鍵來停止加載。

  1. 正常事件沒有足夠的響應,因為后端調用以某種方式消耗了這么多時間,他們沒有及時做出反應。
  2. 在我的閱讀方法中,我添加了顯式檢查 - 但我無法在第三方框架中添加此類檢查。 它也不是一個非常好的方法。

也許有人知道如何可靠並迅速停止一些運行方法。 我可以使用中斷嗎?

關心HW

正常事件響應不夠,因為后端調用會以某種方式消耗這么多時間

這不是它的工作原理。 理解“消息循環”非常重要,請務必閱讀它。 簡而言之,Windows只能告訴程序在程序的主線程空閑時單擊了一個按鈕。 您的主線程應始終處於空閑狀態,以便在需要完成某些工作時立即采取行動。 喜歡畫你的表格或處理擊鍵。 或者在用戶單擊“取消”按鈕時執行某些操作。

這意味着其他東西需要做繁重的工作。 一個帖子。 到目前為止,開始處理棘手的線程世界的最佳方法是BackgroundWorker類。 它有一個CancelAsync()方法,明確設計用於執行您想要執行的操作。 請務必查看MSDN Library文章中為此方法提供的代碼示例。

在單獨的Thread中執行長時間運行的代碼。

Thread thread;
void StartLong()
{
  thread = new Thread(SomeMethod);
  thread.Start();
}

void SomeMethod()
{
  //Long running code here.
}

void CancelButton_Click(object sender, EventArgs e)
{
  //...
  thread.Abort();
}

如果您無法控制執行時間很長的代碼。 你所能做的就是取消它就是中止線程。 thread.Abort();

您應該在單獨的線程中執行“long”=超過1/5秒操作的時間。 打頂一個操作的最好方法是給它一些帶有變量的“上下文”,告訴用戶想要操作或不操作的操作。
如果您無法控制執行該操作的代碼並且代碼是.net,您可以調用Thread.Abort(),但如果代碼不是.net,您唯一能做的就是調用windows api函數“terminatethread”但是你可能會有一些資源泄漏和文件沒有關閉所以你應該考慮使用子進程。

您可以考慮使用BackgroundWorker類,它直接使用線程進行抽象,因此更容易實現。 您只需創建BackgroundWorker的實例並將一些事件處理程序附加到它。 這是一個例子

暫無
暫無

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

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