2011-04-12 33 views
1

我在c#winforms應用程序(Visual Studio 2010,.net 4)中有一個帶有後臺工作器的窗體。當後臺工作人員忙時,我想在嘗試關閉表單並取消表單關閉時提醒用戶。我想通過將表單關閉取消設置爲true來在表單關閉事件中處理它。當後臺工作正在進行時,無法停止窗體關閉

但它仍然關閉窗體!

這裏是代碼片段我用:

private void FormDrivenDistance_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (myBackgroundWorker.IsBusy) 
    { 
    Messenger.ShowCriticalMessage("Don't close, in progress!"); 
        e.Cancel = true; 
    } 
} 

哪裏是錯誤?

在此先感謝!

回答

2

您確定myBackgroundWorker.IsBusy返回true?你有沒有嘗試在檢查中設置一個斷點以確保它被調用?

您確定該事件正確連接?

如果這些事情是真的,那麼這個錯誤將不得不在代碼的其他部分。

FormClosing設置Cancelfalse也可能有一些其他處理程序,但這可能是一個不太可能的情況。

+0

是的,我相信,除此之外,一切正常,isbusy返回true。是的,事件正確地連接起來。 – Tom 2011-04-12 19:57:01

+0

@Tamas當你在'e.Cancel = true;'上設置一個斷點時會發生什麼?並且遍歷代碼? – Davy8 2011-04-12 19:58:37

+0

即使取消設置爲true,它也會簡單地關閉表單。總而言之,我發現了這個錯誤的原因:我使用開源的UI組件來創建像IDE這樣的Visual Studio(http://www.codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx),正如我現在看到的那樣導致的問題,它使窗體關閉在後臺一些技巧,並沒有以正確的方式使用取消...傷心的消息,我需要這個組件,也取消...感謝您的幫助! – Tom 2011-04-12 20:09:14

0

如果您在消息之前移動e.Cancel,該怎麼辦?

請注意,如果您嘗試阻止競爭條件並停止InvalidOperationException在表達式關閉之前完成工作,它不會100%這樣做;您可以在完成本身(InProgress現在爲false)和回調(OnWorkerCompleted)之間的間隔內關閉它。你仍然需要處理異常。

既然您必須處理它,那麼您最好還是讓用戶關閉表單。用戶不得不等待一些他們不關心的事情才能完成。

+0

Thx爲您的答案,但它聽起來對我來說真的很糟糕。我只想取消表格結束,而不是更多。不應該那麼棘手。這就像狩獵與F14雄貓一樣的鴿子......無論如何,感謝你的幫助! ;) – Tom 2011-04-12 20:01:10

相關問題