2016-04-24 65 views
1

我需要在Windows窗体应用程序中挂钩消息循环以执行一些滴答计数相关的工作。在Windows窗体应用程序中挂钩消息循环?

我正在开发一个使用异步方法(异步/等待)的tcp服务器,我避免处理多线程过程中的竞争条件 - 这基本上是我使用async/await而不是其他方法楷模。由于这个限制,我不能创建一个后台线程来执行计数器计数,因为在这种情况下,我将以多线程代码结束。

我认为一个选项是以某种方式将消息循环连接到Windows窗体中,因此我可以使用Windows窗体对象的相同线程轻松地完成与滴答相关的东西,尽管我没有找到任何合适的方法或事件在Windows.Forms.Application类中。

任何人都知道一种方法来做我所需要的?

谢谢。

+0

异步/等待是多线程... –

+0

你好。 @GlenThomas。我知道async/await是多线程的,但是这个模型中的多线程只能在较低层次上运行。我在UI线程中使用async/await写入的所有代码都将在UI线程中执行。 – ptr0x

+0

异步代码将不会在UI线程中运行 –

回答

2

我觉得你最好的办法可能是使用一个计时器,它会在固定的时间间隔执行代码:

var aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
aTimer.Interval = 5000; 
aTimer.Enabled = true; 



// What you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // Do something 
} 
+0

只是附录:如果您需要定时器的回调在特定的SynchronizationContext中执行,请设置Timer.SynchronizingObject! – ptr0x

1

你不会想重写消息循环。在更加简单的GUI解决方案中,这是一种非常常见的方法,但它实际上是.NET上的最后一种方法。

既然你只是想要一个定期的“勾号”,最合适的解决方案是一个计时器。既然你想让它在UI线程上运行,你应该使用System.Windows.Forms.Timer

+0

你好斯蒂芬!我最终使用System.Timers.Timer,因为我需要在没有任何“UI层”依赖的程序集中声明这个定时器。此外,我正在使用的计时器有可能在特定的同步上下文中运行回调。 – ptr0x