【问题标题】:Problems with dispatcher in C# console applicationC# 控制台应用程序中的调度程序问题
【发布时间】:2016-10-12 15:51:21
【问题描述】:

我需要在正确的工作线程上调用在计时器线程上运行的方法。 Invoke/BeginInvoke 过程对我有用。有2个线程共享一个线程间数据容器进行数据交换。一种是填充队列,一种是处理队列。如果队列在空状态后被填充,则会引发事件。所有问题都是由计时器引起的,它在其经过的事件上打开新线程。我正在使用 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 永远不会被调用/调用。

谢谢。

【问题讨论】:

  • 就我个人而言,我会为这类事情使用任务并行库,尤其是在控制台应用程序中。也许这对你来说是一个选择?
  • 你有没有其他方法,如何让计时器事件线程回到主应用程序线程?
  • 如果我没看错的话,任务并行是用于并行运行 tasts。 :-) 我的任务是数据库同步任务,所以它们应该按顺序运行...

标签: c# multithreading dispatcher


【解决方案1】:

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

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

请注意,对 Dispatcher.Run() 的调用不会返回 - 它会进入循环,直到您调用 Dispatcher.BeginInvokeShutdown()

请参阅此blog post 以获取示例。

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 我只是使用 EventWaitHandle 重新设计。我是 .NET 的新手,还在探索。这是主要原因。感谢您的评论。我也会看队列...
猜你喜欢
  • 2013-09-15
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多