2011-06-20 10 views
0

Androidプラットフォームには、メッセージまたはイベントを後で実行するか、別のスレッドで実行するためのHandlerクラスがあります。私はWindows Phone 7プラットフォームで利用可能な同等のAPIのためにMSDNのドキュメントとネットを見ていましたが、何も見つかりませんでした。Silverlight/Windows Phone 7 android.os.Handlerの同等語

私はそのサービスを自分で実装することができますが、ホイールを再開発することは嫌です。誰かが似たようなものを見つけたり、明るい考えを持っていましたか?

乾杯、 Alasdair。

答えて

0

ここにコードの要点を示します。間違いなく変更を加える必要があります。それが役に立てば幸い。

private static Queue<Dictionary<string, string>> messages; 
    .... 
    { 
     ... 
     AutoResetEvent ev = new AutoResetEvent(false); 
     ... 
     Dictionary<string, string> msg1 = new Dictionary<string, string>(); 
     msg1.Add("Id", "1"); 
     msg1.Add("Fetch", "Song1"); 
     Dictionary<string, string> msg2 = new Dictionary<string, string>(); 
     msg2.Add("Id", "2"); 
     msg2.Add("Fetch", "Song2"); 

     messages.Enqueue(msg1); 
     messages.Enqueue(msg2); 

     ThreadPool.RegisterWaitForSingleObject(
      ev, 
      new WaitOrTimerCallback(WaitProc), 
      messages, 
      5000, 
      false 
     ); 

     // The main thread waits 10 seconds, to demonstrate the 
     // time-outs on the queued thread, and then signals. 
     Thread.Sleep(10000); 
     ... 
    } 
    private static void WaitProc(object state, bool timedOut) 
    { 
     // The state object must be cast to the correct type, because the 
     // signature of the WaitOrTimerCallback delegate specifies type 
     // Object. 
     Queue<Dictionary<string, string>> dict = (Queue<Dictionary<string, string>>)state; 

     string cause = "TIMED OUT"; 
     if (!timedOut) 
     { 
      cause = "SIGNALED"; 
      //signaled to return. return without doing any work 
      return; 
     } 
     // timed out. now do the work 
     Dictionary<string, string> s1 = dict.Dequeue(); 
    } 

`

+0

私の質問に答えるための完全なコード例を提供する必要はありません。 ThreadPool.RegisterWaitForSingleObjectメソッド呼び出しの提案で十分です。とにかくありがとう。 – ajmccall

+0

@ajmccall、私は誤解している必要があります。以前のレスポンスで 'ThreadPool.RegisterWaitForSingleObject'と言いましたので、追加の詳細を探していると思いました。とにかく、これが助けてくれてうれしいです。 –

+0

私はこの答えはスレッドセーフではないと思います。 Queueオブジェクトはスレッド間で共有されていますが、ドキュメントではキューのインスタンスが自動的にスレッドセーフではないことが示されています。http://msdn.microsoft.com/en-us/library/system.collections.queue.aspxこの実装この場合、ハンドラは5秒以上何度も待機し続けるため、ハンドラは柔軟性があり、すべてのメッセージが処理される前に正確に同じ時間待機する必要はありません。 – satur9nine

0

サービスをバックグラウンドで実行するか、スレッド上で何かを実行するサービスがあるかどうかは不明です。スレッドのためにThreadPoolクラスを見ましたか?

ThreadPool.QueueUserWorkItemを使用すると、別のスレッドで実行したり、ThreadPool.RegisterWaitForSingleObjectを使用してデリゲートを登録してタイムアウトを待って後で実行することができます。

+0

おかげで、私はこれらのAPIを認識してい@Vivek、目的の動作を実装するためにそれらを使用しています。 Handlerを使用して実装するうえで便利な機能は、メッセージ/アクションのキューイングを無料で取得し、必要に応じてキューをキャンセルする機能です。 – ajmccall

+0

さて、わかりました。確かに、Androidの場合にメッセージをスケジュールして渡すことができます。 RegisterWaitForSingleObjectで辞書項目の列を渡すことを考えていると思います。似たようなことができますか? –

+0

また、Dispatcher.BeginInvokeを参照して、メインスレッド上でコードを実行し直すこともできます(計算結果、ネットワーク呼び出しなどを表示する)。 – wilbur4321

関連する問題