2013-11-09 5 views
0

wp7 앱을 개발 중입니다. WCF 서비스를 사용하여 응용 프로그램 시작시 데이터를 가져옵니다. 데이터를 가져온 후에 ISO Store에 저장해야합니다. DoWork 이벤트에서 서비스 호출이 발생했습니다. BackGroundWorker입니다. 내 지식을 위해서만 비동기 호출은 WCF 윈도우 폰 7에서 가능합니다. Completed 이벤트에 대한 데이터를 얻고 있습니다. 그러나 서비스 Completed 전에 Background worker completed 이벤트가 발생합니다. 서비스 요청에서 데이터를 가져온 후 사용자의 온라인 상태를 업데이트해야합니다.WP7 서비스 담당자가 배경 작업자 C#

내 상태를 업데이트하는 가장 좋은 방법은 무엇입니까? Completed 서비스 콜의 이벤트로 할 수 있습니까? 또는 Background worker completed 이벤트의 상태를 업데이트 할 수있는 방법이 있습니까? 여기

은 왜 비동기 호출의 경우 BackgroundWorker를 사용하는 내 코드

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

입니까? 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 제 관점은 호출이 비동기 적이기 때문에 배경 작업자를 사용하는 것이 목적을 제공하지 않는다는 것입니다. 비동기 호출이 끝날 때까지 DoWork 메소드가 종료되지 않도록 ManualResetEvent를 사용할 수 있습니다. 그러나 리소스가 완전히 낭비입니다. –

+0

@Satheesh 또한 백그라운드 작업자를 사용하는 경우에도 왜 'worker_RunWorkerCompleted '방법? 그냥'cl_ChangeUserStatusCompleted'를 사용하면 잘 작동합니다. –