C#console应用程序中的调度程序问题

时间:2012-06-08 05:56:01

标签: c# multithreading dispatcher

我需要在正确的工作线程上调用计时器线程上的方法。 Invoke / BeginInvoke进程对我有用。有2个线程共享一个线程间数据容器进行数据交换。一个是填充队列,一个是shuld处理队列。如果在空状态之后填充,则队列引发事件。所有问题都是由计时器引起的,计时器在其已用事件上打开新线程。我正在使用Dispatcher在正确的线程上发送,但一切正常,除了这个Dispatcher。 : - )

请问,有人看到问题所在吗?

完整的测试代码在这里: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。

谢谢。

2 个答案:

答案 0 :(得分:4)

您需要通过调用Dispatcher.Run()来启动调度程序,以便调度程序处理调用它的调用。

从控制台应用程序使用Dispatcher非常奇怪 - Dispatcher用于WPF应用程序,但我想它会起作用。

请注意,对Dispatcher.Run()的调用不会返回 - 在您致电Dispatcher.BeginInvokeShutdown()

之前,它会进入循环

有关示例,请参阅此blog post

答案 1 :(得分:1)

Dispatcher.BeginInvoke使用Windows消息泵。您尝试分派的线程(processingThread)没有运行消息泵。

您可以在该线程上运行消息泵,但为什么要这样做而不是使用EventWaitHandle或其他线程同步对象?

此外,代码中队列的操作不是线程安全的。