私は C# 2010 でチャット ソフトウェアに取り組んでおり、すべての受信メッセージが固定タイマーで受信されます。ユーザーに送信するメッセージを入力し、文の入力中に着信メッセージのタイマー呼び出しが発生した場合、すべてが数秒間停止してから再開します。
タイマーとテキストボックスへの入力を独立させる方法はありますか?
私は C# 2010 でチャット ソフトウェアに取り組んでおり、すべての受信メッセージが固定タイマーで受信されます。ユーザーに送信するメッセージを入力し、文の入力中に着信メッセージのタイマー呼び出しが発生した場合、すべてが数秒間停止してから再開します。
タイマーとテキストボックスへの入力を独立させる方法はありますか?
System.Forms.Timer の代わりに System.Timers.Timer を使用します。System.Forms.Timer は UI スレッドで実行されますが、System.Timers.Timer は別のスレッドで実行されます。
考えてみると、タイマーは最善の解決策ではないかもしれません。
ある種のメッセージングシステムを使用することをお勧めします。.NET で使用される Windows 組み込みテクノロジは、Microsoft Message Queue です。
NServiceBusやオープン ソースのMassTransitなど、MSMQ をより快適に使用できるようにするために、MSMQ の上にある既存のフレームワークがあります。
これにより、受信を UI スレッドから切り離し、クライアント アプリケーションでより応答性の高い UI を実現できます。
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;
既に投稿された提案はすべて同じ問題を対象としていますが、アプリケーションがハングする実際の原因については、ここではまだ直接言及されていません。
これは、簡単に言えば、同じスレッドで作業が多すぎるということです。
TimerTick
あなたの場合、タイマーイベントはUIスレッドで処理され、CPU負荷が発生するため、イベント処理メソッドで発生するものに貴重なCPU時間が奪われるため、UIコントロールの入力が遅くなります。
したがって、解決策は複数のスレッドを使用することです。
MSMQ を使用する代わりにタイマー アーキテクチャを維持する必要がある場合は (これを強くお勧めします)、次の MSDN 記事をお勧めします。
この記事は「数日前」のものですが、原則は今日でも完全に有効です。
.NET 4.x バージョンで作業している場合は、Task Parallel Libraryを使用して、複数のスレッドでの作業を容易にすることもできます。
間もなく登場する .NET 4.5 では、さらに快適な await および asyc キーワードも提供されます: Async および Await を使用した非同期プログラミング。