2011-07-11 6 views
1

バックグラウンドWebリクエストを作成してUIを更新するにはどうすればよいですか?Webをリクエスト/解析するコードはすべて別のクラスで行いますので、 ?私はAPIHelperの方法を持っているWindows Phone 7でスレッドとWebリクエストを処理する

APIHelper mHelper = new APIHelper("http://example.com?foo=bar"); 
BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork +=new DoWorkEventHandler(mHelper.GetResponse); 
bw.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(mHelper.HandleResponse); 
bw.RunWorkerAsync(); 

のように、BackgroundWorkerのクラスのイベントハンドラなどのクラスのメソッドを使用すると考えていた

public void GetResponse(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = (BackgroundWorker) sender; 

    WebRequest request = HttpWebRequest.Create(this.URL); 
    IAsyncResult result = (IAsyncResult) 
           request.BeginGetResponse(ResponseCallback, request); 
} 

が、その後、私はからワーカースレッドにアクセスする方法がわかりませんResponseCallback、とにかく、HandleResponseが最初に呼び出されます(明らかに)。 (私はresult.AsyncWaitHandle.WaitOne();を入れてみましたが、NotSupportedExceptionエラーが発生します)。しかし、Webリクエストを同期的に呼び出す方法を考えることはできません。私は明らかにこれを間違った方向に進めようとしていますが、正しい方法が何であるか分かりません。


ETA:

私の目的は行くことができるようにすることです:

  • ユーザーがクリックする(さまざまなページ上)(a)のボタン(S)

  • UIスレッドに「作業中」のメッセージが表示された後(入力がブロックされている)

  • バックグラウンドスレッドでAPIHelperクラスがAPI呼び出しを行い、応答を取得してUIスレッドに返します。

何同期Webがないので、私は唯一の返されたメッセージを持つ

  • UIスレッドの更新を要求し、別のスレッドを開始し、それが戻るのを待つことによってこれを行うことができるように見える(と入力は以前のように続けます)

    私は最初の2ビットを行うことができます。応答がある場合、最後のビットを実行できますが、中位ビットを実行する方法を考えることはできません。うまくいけば、それはそれをより明確にしました!

  • +0

    なぜコールバックでBackgroundWorkerにアクセスする必要がありますか? –

    +0

    私は応答を返すことができます。 –

    答えて

    2

    Dispatcherが見つかるまでに数回試しました。私はDispatcherがビューでのみ利用可能であると考え

    this.Dispatcher.BeginInvoke(() => 
    { 
    // UPDATE UI BITS 
    }); 
    

    :あなたが呼び出すことができますBackgroundWorkerdoworkcomplete方法の間に

    。したがって、xaml.csの外部にメソッドが存在するかどうかはわかりません。

    UIに更新したいものを入れてください。これはちょうど荒いノート

    を支援するために http://www.windowsphonegeek.com/articles/All-about-Splash-Screens-in-WP7-ndash-Creating-animated-Splash-Screen

    更新:ObservableCollectionを更新するときには、このリンクはあまりにも良い読み取りかもしれませんあまりにも

    Dispatcher.BeginInvokeであなたのアイテムの更新を行う必要がありますアイデアを気にかけて...

    bw.DoWork +=new DoWorkEventHandler(DoWork); 
    bw.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(Complete) 
    
    // At least I think the EA is DoWork.... 
    public void DoWork(object sender, DoWorkEventArgs e) 
    { 
         mHelper.GetResponse(); 
         this.Dispatcher.BeginInvoke(() => 
         { 
           UIObject.Visibility Collapse. 
         }); 
    
         // Wait and do work with response. 
        }); 
    } 
    
    public void Complete(object sender, RunWorkerCompleteEventArgs e) 
    { 
         this.Dispatcher.BeginInvoke(() => 
         { 
           UIObject.Visible .... 
         }); 
    } 
    
    +0

    非同期WebリクエストのコールバックメソッドからDispatcherを呼び出すことができないようで、コールバックメソッドが実行される前にBackgroundWorkerの完全メソッドが終了します。 –

    +0

    私はあなたのAPIヘルパーを 'dowork'メソッドから呼び出すでしょう。バックグラウンドワーカーのアイデアは、続行する前に、あなたがしなければならないことをすることです。あなたがあなたがあなたとする必要がある作業を呼び出すと完了しようとすると、そこからバックグラウンドワーカーを渡す必要はありません。 –

    +0

    さて、それは理にかなっているようですが、ウェブレスポンスが戻ってくるのをどのように待つのですか? –

    0

    私はこのロジックをすべてのページのviewmodelが継承するビューモデルに入れました。
    モデルが適切に更新されるviewmodelのプロパティ(ShowLoadingなど)にページをバインドさせます。すなわち、ウェブ要求を行う前およびコールバック中に実行される。

    UIスレッドでビューモデルコードを実行しないので、別のBackgroundWorkerで実行する必要もなく、viewmodelのプロパティに問題なくアクセスできます。

    +0

    View-Model-ViewModelのどこかに良いチュートリアルがありますか? –

    +1

    @Ben http://www.galasoft.ch/mvvm/の紹介セクションのリンクをご覧ください。 –

    +0

    このリンクをご利用いただきありがとうございます! –

    0

    WP7開発中にWebDownload用に開発したヘルパークラスを使用すると便利です。

    私は2-3 WP7アプリでこれを使用していますが、今まで問題はありません。それが役立つかどうかを確認してください。 【注意】このクラスで作業するときは、バックグラウンドワーカーや新しいスレッドで何かを実行する必要はありません

    http://www.manorey.net/mohblog/?p=17#content

    ;:あなたは怒鳴るリンク私のブログからクラスを取得することができますそれをすべて非同期に処理します。

    +0

    私はそれを見て、感謝します! –

    関連する問題