我正在使用 C# 2010 开发聊天软件,其中所有传入消息都由固定计时器接收。当我键入要发送给用户的任何消息时,并且在我的句子键入过程中,如果传入消息计时器呼叫来了,一切都会停止几秒钟,然后再次恢复。
有没有办法让计时器和输入到文本框独立?
我正在使用 C# 2010 开发聊天软件,其中所有传入消息都由固定计时器接收。当我键入要发送给用户的任何消息时,并且在我的句子键入过程中,如果传入消息计时器呼叫来了,一切都会停止几秒钟,然后再次恢复。
有没有办法让计时器和输入到文本框独立?
而不是 System.Forms.Timer 使用 System.Timers.Timer。System.Forms.Timer 将在 UI 线程中运行,而 System.Timers.Timer 在不同的线程中运行。
考虑一下,计时器可能不是最好的解决方案。
我建议使用某种消息传递系统。与 .NET 一起使用的 Windows 内置技术是 Microsoft 消息队列。
有一些现有的框架位于 MSMQ 之上,以使使用它更加舒适,例如NServiceBus或开源MassTransit。
这将使接收与您的 UI 线程分离,并使您能够在客户端应用程序上获得响应更快的 UI。
虽然已经发布的建议都是针对同一个问题的,但是这里还没有直接提到你的应用程序挂起的实际原因。
简单地说,就是在同一个线程中工作太多。
在您的情况下,计时器事件在 UI 线程上处理并导致一些 CPU 负载,因此 UI 控件中的输入变慢,因为宝贵的 CPU 时间被占用TimerTick
事件处理方法中发生的任何事情。
因此,解决方案是使用多个线程。
如果您需要保留计时器架构而不是使用 MSMQ(我仍然强烈建议),我建议您阅读这篇 MSDN 文章:为您的基于 .NET 的应用程序提供具有多线程的快速响应式 UI
这篇文章是“几天前的”,但这些原则在今天仍然绝对有效。
如果您使用的是 .NET 4.x 版本,您还可以使用任务并行库来更轻松地处理多个线程。
即将推出的 .NET 4.5 还提供了更加舒适的 await 和 asyc 关键字:使用 Async 和 Await 进行异步编程。
如果您使用的是 winforms,请尝试在单独的线程中获取消息
Thread thread = new Thread(new ThreadStart(GetMessage));
thread.Start();
public void GetMessage()
{
//Message showing code goes here
Thread.Sleep(10000);
GetMessage();
}
您不需要独立的计时器,您需要计时器的功能。
在你的 timer.Tick 事件中添加这个
Task.Factory.StartNew( () =>
{
//do what you need to do here ie.
string something ="Hello";
this.BeginInvoke( new Action(() =>
{
//update textbox here
textBox1.Text=something;
}));
});
您将需要此命名空间
using System.Threading.Tasks;