2011-12-15 4 views
0

ローカルプッシュサーバーに接続しようとしているC#でコンソールアプリケーションを作成し、そこからメッセージを受信します。同じデータを同時に受け取るスレッドの使い方は?

私は、次のコードを使用して作られた「単一の」接続用のプッシュサーバーからの応答を読み取ることができるアプリケーションを作成しました:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.15.174/MvisumPushServer/PushServer.ashx?op=2&DeviceUniqueID=50211&ConnectionTimeout=30&ConnectionMechanism=Wifi&OSVersion=10&DeviceMake=Android&DeviceModel=sdk"); 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream stream = null; 
    stream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(stream); 
    s = reader.ReadLine(); 
    Console.WriteLine(s); 

は今、私はシングルから5つの以上の接続のために同じことをやりたいですスレッドを使用したプログラム。 これらの多くの接続は、すべてのメッセージを個別に受信する必要があり、コンソールに表示する必要があります。たとえば、5つの通知がコンソール上のプッシュサーバーから生成された場合、合計25個のアラートを書き込む必要があります。つまり、各接続はプッシュサーバーから各メッセージを受信します.Lock(これ)を使用して試しましたが、合計5個のアラートがコンソールに表示されます。

答えて

0

あなたのアプローチが重要な場合は、定期的にオンになるデバイスに関することです。つまり、サーバーをテストする場合は、タイマーを使用してポーリングを実行する必要があります。
スレッドセーフなキューを使用して応答をエンキューし、それらを個別にデキューしてコンソールに書き込む限り、特定の間隔またはランダムな間隔で既に持っているコードを持つルーチンを呼び出すタイマーの配列がそのジョブを実行します。さらに、このルーチンは、DeviceUniqueIDを(同じ長さの別の配列を持つ)各タイマーに接続する場合、異なるDeviceUniqueIDを(パラメーターとして)受け入れることができます。

0

問題は実際にはロックと思われます。私はいくつかのスレッドがロックを獲得していると思うし、ReadLineでブロックし、他のスレッドが進行しないようにしていると思われます。 WriteLineがスレッドセーフであると仮定すると、上のコードを問題なく5つのスレッドで実行できるはずです。

0

スレッドのアプローチが問題の原因であるとは思われません。あなたのサーバーは、接続ごとに5つのイベントではなく、接続ごとに1つのイベント(5つの接続)を送信しているようです。

関連する問題