2012-07-30 47 views
0

爲了設置舞臺,我有一個名爲Scheduler的自定義類,它擁有多個Task對象(這也是一個自定義類)。每個任務都有一個BackgroundWorker對象來運行長時間運行的工作。我目前正在進行一些測試,讓其中的許多任務能夠快速執行並在同一時間處理。什麼時候在執行時處理事件?

在我的Task對象中,我在TaskWorkerCompleted處理程序中引發自定義事件(TaskCompletedEvent)以提醒調度程序任務已完成。調度程序爲每個任務的TaskCompletedEvent使用相同的事件處理程序。

我想知道的是,如果我目前在SchedulerTaskCompletedEvent處理程序執行代碼和另一個事件結束,會發生什麼?兩者都將在UI線程上,那麼當前在事件處理程序中的那個會在另一個之前完成呢?當兩個事件同時完成並需要處理時,我會對將要發生的事情感到困惑。

+0

你是什麼意思,兩者都在UI線程上?如果它們在UI線程上,則它們不能同時完成。也許你的代碼樣本可能會有所幫助。 – svick 2012-07-30 16:36:16

+0

你究竟如何提升'TaskCompletedEvent'?你從UI線程做到這一點嗎? – svick 2012-07-30 16:38:10

+0

@svick是的,我從UI線程中獲取它。我認爲弗拉德回答了我的問題。我只需要測試一些代碼以確保正確理解它。 – Justin 2012-07-30 16:41:36

回答

1

不,事件本身不知道UI線程。所以這些事件將被派發到它們被解僱的同一個線程中(這很可能在後臺工作的線程中,對吧?)

如果你的兩個事件在UI線程中被觸發,這不能同時發生(畢竟, UI線程正在執行一個或另一個事件觸發代碼),所以當第一個事件完成了觸發和分派時,第二個事件可能會被觸發。

如果您希望Scheduler將事件封送到UI線程,這是一個稍微不同的故事。你需要在UI線程中執行的代碼實際上會被髮布到該線程的一種事件隊列中,並且無論事件觸發代碼發生在何處,都會首先執行。

+0

在UI線程上觸發backgroundworker事件。我猜它使用Invoke。所以我不需要擔心這兩個事件同時處於同一個方法中,因爲它們在同一個線程中,對嗎? – Justin 2012-07-30 16:36:42

+0

@Justin:是的。 UI線程中的代碼將按順序執行;當第一個事件觸發並且所有事件處理程序完成時,只有UI線程纔會查找下一個已分派的命令,而不是同時查找。 – Vlad 2012-07-30 16:38:18