2012-06-08 149 views
1

我需要在右工作線程上調用定時器線程上的方法。 Invoke/BeginInvoke進程正在爲我工​​作。共有2個線程共享一個線程數據容器進行數據交換。一個是填充隊列,一個是隊列處理。如果Queue在空狀態後被填充,則會引發事件。所有的問題都是由計時器引起的,計時器會在其已過去的事件上打開新的線程。我使用Dispatcher在正確的線程上分派,但一切正常,除了這個Dispatcher。 :-)C#控制檯應用程序中調度程序的問題

請問有沒有人看到問題在哪裏?

完整的測試代碼在這裏:http://pastebin.com/jqYbR9PS

調試輸出是這樣的:

App Thread ID: 9 
Processor Thread ID: 10 
Processor Dispatcher Thread ID: 10 
The thread '<No Name>' (0x888) has exited with code 0 (0x0). 
Processor QueueListener caller Thread ID: 12 
Processor Dispatcher Thread ID: 10 
Processor invoking ProcessQueue. 
...here shut be processing output... 
Processor invoked ProcessQueue. 
App Thread ID on end: 9 
The thread 'vshost.RunParkingWindow' (0x17c4) has exited with code 0 (0x0). 
The thread '<No Name>' (0x820) has exited with code 0 (0x0). 
The program '[5760] TestingConsoleApplication.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0). 

ProcessQueue不調用/調用。

謝謝。

+3

就我個人而言,我會使用任務並行庫這種類型的東西,尤其是在控制檯應用程序。也許這對你來說是一種選擇? –

+0

您是否看到任何其他方式,如何將計時器事件線程返回主應用程序線程? – Fanda

+0

如果我讀得很好,任務並行是爲了平行運行。 :-)我的任務將是數據庫同步任務,所以他們應該順序運行... – Fanda

回答

4

您需要通過調用Dispatcher.Run()實際啓動調度程序,以便調度程序處理調用的調用。

從控制檯應用程序中使用分派器很奇怪 - 分派器用於WPF應用程序,但我想它會工作。

注意,調用Dispatcher.Run()不會返回 - 直到你打電話Dispatcher.BeginInvokeShutdown()

它會進入一個循環請參見本blog post的一個例子。

+0

這是很奇怪的使用...謝謝你的提示。我將重新設計... – Fanda

+1

查看這些關於如何實現這些Invokes的Syncrhonization上下文。它可以幫助您重新設計:http://msdn.microsoft.com/en-us/magazine/gg598924.aspx - http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I - http://www.codeproject.com/Articles/32113/Understanding-SynchronizationContext-Part-II – shf301

+0

因爲你寫了建設性的懷疑,我將你的答覆標記爲答案。 :-) – Fanda

1

Dispatcher.BeginInvoke使用windows消息泵。您嘗試分派的線程(processingThread)未運行消息泵。

您可以在該線程上運行消息泵,但爲什麼要這樣做而不是使用EventWaitHandle或其他線程同步對象?

另外,代碼中隊列上的操作不是線程安全的。

+0

我只是重新設計使用EventWaitHandle。我是.NET和窗臺探索新手。這是主要原因。感謝您的評論。我也會觀看隊列... – Fanda