2012-06-08 110 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