2011-10-19 15 views
1

私は、(JAVA)サーバーをポーリングして非同期に受信するWinCE C#アプリケーションを持っています。私が達成したいのは、サーバーをポーリングし、結果が返されたらキューに入れて、その結果を別のスレッドで処理することです。私は応答を処理した後、私はサーバーに追加のPOSTを行う必要があるかもしれないので、プロセススレッドから非同期受信スレッドを分離したいと思います。別のスレッドで非同期処理が行われる

何私は今のところ持っていることは、ここのサーバへの非同期リクエストを作成し、応答を読み取るための

http://msdn.microsoft.com/en-us/library/86wf6409%28v=vs.80%29.aspx

を示したものと同様のクラスです。カスタムタイムアウトを含むようにクラスを変更しましたが、それは問題ではありません。

私のアプリで起こることは、スレッド 'pollingThread'でポーリングを開始し、サーバーからの応答を取得することです。時間切れの場合、応答はnullになります。そうでなければ、応答を処理しようとします。

応答文字列を処理する別のスレッドに応答文字列を送信したいのですが、私のpollingThreadはサーバーのポーリングを続けるために戻ります。私は別のスレッドに応答を取得する方法を把握することはできません。大きなウィンドウでMonitor.Pulseを使用する方法を知っていますが、残念ながらNETCF 3.5では使用できません。

洞察?

おかげ

EDIT:Damon8or

@私は自動リセットを使用してみましたが、何らかの理由、WAITONE(用)は、他のスレッドがすでに設定されていることを認識しません()イベントとそれを逃しますデータは通過します。ここで私が持っているものです。

AutoresetEvent _processはstaticと宣言し、両方の方法ポールの内側

ThreadStart processMethod= new ThreadStart(process); 
processingThread= new Thread(processJSONMethod); 
processingThread.IsBackground = true; 
processingThread.Start(); 

ThreadStart startMethod = new ThreadStart(Poll); 
connectionThread = new Thread(startMethod); 
connectionThread.IsBackground = true;      
connectionThread.Start(); 

に表示されている、私は_process.Set()後にサーバから文字列を受信して​​います。プロセスメソッドでは、私は持っています:

while (_keepPolling) 
{ 

_process.WaitOne(); 

string text= MyQueue.Dequeue(); 
Debug.WriteLine("Returned: " + text 

}  

そして、私はデバッグ行が印刷されて表示されません。ポールメソッドは文字列を生成してキューに入れ、ポーリングに戻ります。

+0

あなたの質問は何ですか? –

+0

結果が別のスレッドで処理されている間、私は自分のpollingThreadにポーリングを続けていることを確認したい。結果がキューにプッシュされた後に結果の処理を行うスレッドを起動する方法を理解できません。 – Rishi

答えて

1

。ここに簡単な例があります。

using System; 
    using System.Linq; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Threading; 

    namespace QueueDoodles 
    { 
    class Program 
    { 
     public static readonly string[] data = { "a", "b", "c", "d", "e", "f", "g", "h" }; 

     static void Main(string[] args) 
     { 
      var running = true; 
      var rand = new Random(); 
      var q = new Queue<string>(); 
      var qEvent = new ManualResetEvent(false); 
      var pollThread = new Thread(new ThreadStart(delegate() 
      { 
       while (running) 
       { 
        // Queue the next value 
        var value = data[rand.Next(data.Length)]; 
        q.Enqueue(value); 
        Console.WriteLine("{0} queued {1}", Thread.CurrentThread.Name, value); 

        // Signal waiting thread 
        qEvent.Set(); 

        // Simulate polling 
        Thread.Sleep(rand.Next(100)); 
       } 
      })); 
      pollThread.Name = "Poll Thread"; 

      var workerThread = new Thread(new ThreadStart(delegate() 
      { 
       while (running) 
       { 
        // Wait on the queue 
        if (!qEvent.WaitOne()) 
         break; 
        qEvent.Reset(); 

        // Process the next queue item 
        var value = q.Dequeue(); 
        Console.WriteLine("{0} queued {1}", Thread.CurrentThread.Name, value); 
       } 
      })); 
      workerThread.Name = "Worker Thread"; 

      // Start the poll thread 
      pollThread.Start(); 

      // Give it some time to fill queue 
      Thread.Sleep(1000); 

      // Start the worker thread 
      workerThread.Start(); 

      // Wait for keyboard input 
      Console.ReadLine(); 
      running = false; 
      qEvent.Set(); 
     } 
    } 
} 
+0

質問の編集を見てください。ありがとう – Rishi

+0

私はThread.Sleep(10)を追加しました。セットの直後に、WaitOne()が待たされるのを助けてくれたようだった。それをどうしたらいいのか分かりませんが、今では2つのスレッドが並行して動作していないという別の問題があります。処理スレッドはconnectionThreadをブロックしているように見えますが、そうではありません。 サニティチェックと同じように、私は両方のスレッドをバックグラウンドスレッドとして持っています。違いがありますか?ありがとう – Rishi

+0

私は自分のQueueDoodleコードでAutoResetEventに切り替えようとしましたが、そのタイプで自動的に行われたので、Reset()コールがコメントアウトされました。イベントや処理スレッドで何かが起こっているはずです。私はこれらのイベントクラスを広範囲に使用しており、常に動作します。いくつかのことを試してみてください... - あなたの処理スレッドにデバッグstatmentsを追加して、実行中であるかどうかを確認してください。 - WaitOne(1000)にタイムアウトを追加し、イベントがトリガーされているかどうかを確認するだけで戻り値を確認します。 - ManualResetEventの動作が異なるかどうかを確認します。 – Damon8or

1

キュークラスはスレッドセーフです。なぜキューを使用してデータをキューに入れないのですか?あなたのワーカースレッドを知らせるためにAutoResetEventまたはManualResetEventのいずれかを使用することができます

http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx

+0

"すべてのインスタンスメンバーはスレッドセーフであることが保証されていません。" – RandomEngy

+0

また、データのキューイングは私の問題ではありません。私はそれのためにキューを使用することができます。私の問題は、私のpolingThreadがポーリングを続けていることを確認しながら、結果を処理するために私の 'processor'スレッドを起きる方法です。 – Rishi

関連する問題