2013-11-09 2 views
0

Я разрабатываю приложение wp7. В этом я использую службу WCF для получения данных о запуске приложения. После получения данных мне нужно сохранить его в магазине ISO. Сервисный вызов происходит в DoWork события BackGroundWorker. Насколько мне известно, с WCF в Windows Phone 7 возможен только асинхронный вызов. Я получаю данные о событии вызова службы Completed. Но событие Background worker completed происходит до Completed события службы. Мне нужно обновить некоторые онлайн-статус пользователя после получения данных из служебного вызова.WP7 Service Call in background worker C#

Какова наилучшая практика для обновления моего статуса. Хорошо ли делать в 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 
    } 

ответ

0

Почему вы используете BackgroundWorker для асинхронного вызова? Если вам необходимо выполнить обратный вызов в потоке пользовательского интерфейса, вы можете использовать диспетчер вместо этого:

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 
    }); 
} 
+0

Мне нужно сделать 4 служебных вызова при запуске для разных целей. Итак, я предпочел backgroundworker – Satheesh

+1

@Satheesh. Я хочу сказать, что использование фонового работника не будет служить какой-либо цели, так как вызов является асинхронным. Вы можете использовать ManualResetEvent для предотвращения выхода DoWork-метода до завершения асинхронного вызова, но это полная трата ресурсов. –

+0

@Satheesh. Кроме того, даже если вы используете фонового рабочего, почему вы абсолютно хотите выполнить обработку в 'worker_RunWorkerCompleted 'метод? Просто используйте 'cl_ChangeUserStatusCompleted', и он будет работать нормально –