0

wp7 アプリを開発しています。その中で、WCF サービスを使用して、アプリケーションの開始時にデータを取得します。データを取得したら、ISO ストアに保存する必要があります。DoWorkのイベントで サービスコールが発生しましたBackGroundWorker。私の知る限り、Windows Phone 7 の WCF では非同期呼び出しのみが可能ですCompleted。サービス呼び出しのイベントに関するデータを取得しています。しかし、Background worker completedイベントはサービスのイベントの前に発生してCompletedいます。サービス コールからデータを取得した後、ユーザーのオンライン ステータスを更新する必要があります。

ステータスを更新するためのベスト プラクティスは何ですか。Completedサービスコールの際に行ってもよろしいでしょうか?Background worker completedまたは、イベントでステータスを更新する方法はありますか。

これが私のコードです

    private void StartLoadingData(bool status)
    {

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.RunWorkerAsync(status);
    }


    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        if (!string.IsNullOrEmpty(this.CurrentUser))
        {
           ServiceReferenceClient cl = new ServiceReferenceClient() ;
            cl.ChangeUserStatusCompleted += new EventHandler<ChangeUserStatusCompletedEventArgs>(cl_ChangeUserStatusCompleted);
            cl.ChangeUserStatusAsync(this.CurrentUser, true);               
            e.Result = true;
        }           

    }

    private void cl_ChangeUserStatusCompleted(object sender, ChangeUserStatusCompletedEventArgs e)
    {
        // here i will get my result to process next step
    }
   private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      // result obtained from service need here
    }
4

1 に答える 1

0

非同期呼び出しにバックグラウンドワーカーを使用しているのはなぜですか? UI スレッドでコールバックを実行する必要がある場合は、代わりにディスパッチャーを使用できます。

private void StartLoadingData(bool status)
{
    if (!string.IsNullOrEmpty(this.CurrentUser))
    {
       ServiceReferenceClient cl = new ServiceReferenceClient() ;
       cl.ChangeUserStatusCompleted += new EventHandler<ChangeUserStatusCompletedEventArgs>(cl_ChangeUserStatusCompleted);
       cl.ChangeUserStatusAsync(this.CurrentUser, true);               
    }  
}

private void cl_ChangeUserStatusCompleted(object sender, ChangeUserStatusCompletedEventArgs e)
{
    Dispatcher.BeginInvoke(() => 
    {
        // Update the UI here
    });
}
于 2013-11-09T11:02:48.893 に答える