1

我正在使用 C# 2010 开发聊天软件,其中所有传入消息都由固定计时器接收。当我键入要发送给用户的任何消息时,并且在我的句子键入过程中,如果传入消息计时器呼叫来了,一切都会停止几秒钟,然后再次恢复。

有没有办法让计时器和输入到文本框独立?

4

5 回答 5

2

而不是 System.Forms.Timer 使用 System.Timers.Timer。System.Forms.Timer 将在 UI 线程中运行,而 System.Timers.Timer 在不同的线程中运行。

于 2012-06-13T10:51:43.803 回答
1

考虑一下,计时器可能不是最好的解决方案。

我建议使用某种消息传递系统。与 .NET 一起使用的 Windows 内置技术是 Microsoft 消息队列。

有一些现有的框架位于 MSMQ 之上,以使使用它更加舒适,例如NServiceBus或开源MassTransit

这将使接收与您的 UI 线程分离,并使您能够在客户端应用程序上获得响应更快的 UI。

于 2012-06-13T10:59:15.927 回答
0

虽然已经发布的建议都是针对同一个问题的,但是这里还没有直接提到你的应用程序挂起的实际原因。

简单地说,就是在同一个线程中工作太多

在您的情况下,计时器事件在 UI 线程上处理并导致一些 CPU 负载,因此 UI 控件中的输入变慢,因为宝贵的 CPU 时间被占用TimerTick事件处理方法中发生的任何事情。

因此,解决方案是使用多个线程。

如果您需要保留计时器架构而不是使用 MSMQ(我仍然强烈建议),我建议您阅读这篇 MSDN 文章:为您的基于 .NET 的应用程序提供具有多线程的快速响应式 UI

这篇文章是“几天前的”,但这些原则在今天仍然绝对有效。

如果您使用的是 .NET 4.x 版本,您还可以使用任务并行库来更轻松地处理多个线程。

即将推出的 .NET 4.5 还提供了更加舒适的 await 和 asyc 关键字:使用 Async 和 Await 进行异步编程

于 2012-06-13T12:11:44.603 回答
0

如果您使用的是 winforms,请尝试在单独的线程中获取消息

Thread thread = new Thread(new ThreadStart(GetMessage));
thread.Start();

public void GetMessage()
{
     //Message showing code goes here 
      Thread.Sleep(10000);
      GetMessage();
}
于 2012-06-13T10:54:11.463 回答
0

您不需要独立的计时器,您需要计时器的功能。

在你的 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;
于 2012-06-13T10:54:26.237 回答