后台工作者C#中的WP7服务调用

时间:2013-11-09 09:47:43

标签: wcf windows-phone-7 c#-4.0 backgroundworker

我正在开发一个wp7应用程序。在那里我使用WCF服务来获取应用程序启动时的数据。获取数据后,我需要将其存储在ISO Store中。 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
    }

1 个答案:

答案 0 :(得分: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
    });
}