私はIRCチャネルに接続し、StreamReaderでチャットを読み取るボットを持っています。すべて正常に動作し、ボットは読み取りと応答が可能ですが、問題はWindowsフォームがStreamReaderがアクティブな間にフリーズしていることです。StreamReaderを実行すると、アプリケーションが応答しなくなります
while(true)
{
string message = irc.readMessage();
if (message.Contains("!test"))
{
irc.sentChatMessage("answer");
}
}
変更なしで100msごとにティックするwhileループではなく、タイマーに入れてみました。
方法
public string readMessage()
{
string message = inputStream.ReadLine();
return message;
}
'ReadLine'ブロックがフルラインになるまでブロックしますが、それを呼び出すと何が期待されますか?フルラインはまだありません。バックグラウンドスレッドに置くか、 'ReadLineAsync()'を使う必要がありますが、 'while(true)'ループがどこにあるのかわからない限り、それを行う方法の完全な例を与えることはできません。 –
メソッド 'readMessage()'はUIスレッドをブロックします。どのストリームを使用しているのか分かりませんが、使用できる場合は非同期オーバーロードを使用できますか?あるいは、別のスレッドでメソッドを実行することもできます。これにより、 'inputStream.ReadLine();'がUIスレッドをブロックするのを防ぎます。 –
@Scott Chamberlain while(true)ループは、Windowsフォーム経由でボットに接続するとすぐにアクティブになり、その時間全体でアクティブになるはずです。私はフォームの機能を保持したいので、例えばアプリケーションを閉じることができます。 – Gruhlum