2013-11-09 64 views
0

我正在開發一個wp7應用程序。因爲我使用WCF服務來獲取應用程序啓動數據。獲得數據後,我需要將其存儲在ISO商店中。服務電話發生在DoWork事件BackGroundWorker。據我所知,在windows phone 7中只能使用WCF進行異步呼叫。我正在獲取有關Completed服務呼叫事件的數據。但Background worker completed事件發生在Completed事件服務之前。我需要在獲得服務呼叫數據後更新用戶的一些在線狀態。WP7服務電話在後臺工作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的異步調用?如果您需要它在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 
    }); 
} 
+0

我必須在啓動時針對不同目的進行一些4次服務調用。所以我更喜歡backgroundworker – Satheesh

+1

@Satheesh我的觀點是,使用後臺工作人員不會有任何目的,因爲調用是異步的。您可以使用ManualResetEvent來防止DoWork方法退出,直到異步調用結束,但這完全浪費資源 –

+0

@Satheesh另外,即使在使用後臺工作者時,爲什麼您絕對要在'worker_RunWorkerCompleted '方法?只需使用'cl_ChangeUserStatusCompleted',它會正常工作 –