簡體   English   中英

C#如何將休息發送到另一個子例程?

[英]C# How can I send a break to another sub routine?

我有一個循環運行,將處理1000的記錄,目前一旦循環運行它無法停止,用戶必須等到它完成。 當有人點擊“取消”按鈕時,如何停止循環? 我如何打破其他常規?

謝謝

您可以在自己的線程中運行它並中止線程。 請注意,這可能會使操作處於不良狀態。

相反,您應該創建一個線程在安全點檢查的退出標志。 如果它被標記為退出,則線程將在它安全的情況下立即停止。

您只需使用BackgroundWorker組件即可。

它是基於事件的,非常容易使用。 看起來非常適合您所描述的內容。

它對取消信令以及進度報告也提供了很好的支持。

你可以在谷歌上查找很多代碼示例。


設置WorkerSupportsCancellation屬性,使其成立。

backgroundworker1.WorkerSupportsCancellation = true;

在你開始工作之前做它。

然后,在循環中,您可以輪詢CancellationPending屬性:

if (backgroundWorker1.CancellationPending) return;

舉個例子,你應該明白這個想法。

謝謝你的回復。 它是一個backgroundworker但是當我使用backgroundworker1.cancelAsync(); 我得到了例外:

“此BackgroundWorker聲明它不支持取消。修改WorkerSupportsCancellation以聲明它確實支持取消”

我該如何改變這個? 這是繼承的代碼,對不起!

正如馬克所說,你需要實施某種合作同步。 人們經常傾向於想在這里使用Thread.Abort ......但這是一個壞主意。

有很多問題可以解決這個問題,例如,參見:“ C#中是否有一個很好的方法可以在給定的線程上拋出異常。

您可以添加一個設置布爾標志的取消按鈕

在循環內部在關鍵點添加“Application.DoEvents”,然后檢查布爾標志。 如果標志已被觸發,則執行清理並退出循環。

設置WorkerSupportsCancellation你的財產BackgroundWorker真:-)

您還必須檢查循環中的CancellationPending屬性,看看是否應該中止處理。 chakrit鏈接的MSDN文章有一個很好的示例代碼塊

編輯:D'哦,你讓我在幾秒鍾內有chakrit :)

暫無
暫無

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

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