2016-06-16 15 views
0

私は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; 
    } 
+0

'ReadLine'ブロックがフルラインになるまでブロックしますが、それを呼び出すと何が期待されますか?フルラインはまだありません。バックグラウンドスレッドに置くか、 'ReadLineAsync()'を使う必要がありますが、 'while(true)'ループがどこにあるのかわからない限り、それを行う方法の完全な例を与えることはできません。 –

+0

メソッド 'readMessage()'はUIスレッドをブロックします。どのストリームを使用しているのか分かりませんが、使用できる場合は非同期オーバーロードを使用できますか?あるいは、別のスレッドでメソッドを実行することもできます。これにより、 'inputStream.ReadLine();'がUIスレッドをブロックするのを防ぎます。 –

+0

@Scott Chamberlain while(true)ループは、Windowsフォーム経由でボットに接続するとすぐにアクティブになり、その時間全体でアクティブになるはずです。私はフォームの機能を保持したいので、例えばアプリケーションを閉じることができます。 – Gruhlum

答えて

2

inputStream.ReadLine();は、UIスレッドをブロックしているためです。非同期オーバーロードStreamReader.ReadLineAsyncを使用すると、非同期に実行され、UIスレッドをブロックしません。

サンプル:

async void StartBot() 
{ 
    while(true) 
    { 
    string message = await irc.readMessageAsync(); 
    if (message.Contains("!test")) 
    { 
     irc.sentChatMessage("answer"); 
    } 
    } 
} 

public async Task<string> readMessageAsync() 
{ 
    string message = await inputStream.ReadLineAsync(); 
    return message; 
} 

あなたは非同期についてサンプルとしてaswellより多くの情報を見つけてhereを待つことができます。

+0

ありがとう、私はあなたのコードで動作している、私はもう一度while(true)ループを追加する必要があった。 – Gruhlum

+0

@ Gruhlum yw、私はwhileループを含める答えを編集しました。 –

関連する問題