2011-08-27 2 views
0

일부 데이터를 목록에 추가 중이며이를 수행하는 데 다소 시간이 걸릴 수 있습니다. 따라서이 작업을 비동기 적으로 수행합니다. 나는 이것을 좋아한다 :비동기 작업에서 호출 된 CallbackMethod는 정확히 언제입니까?

ScanDelegate worker = StartScan; 
AsyncCallback completedCallback = ScanCompletedCallback; 
lock (_sync) 
{ 
    var async = AsyncOperationManager.CreateOperation(null); 
    worker.BeginInvoke(completedCallback, async); 
} 

StartScan()에 추가 된 정보가 목록에 올바르게 추가되었다. 스캔이 완료되면 목록의 데이터에 따라 다른 스캔을 수행하려고합니다. 그래서 ScanCompletedCallback() 메소드에서 다른 스캔을 시작합니다. 그러나이 시점에서 내 목록은 비어 있습니다. 콜백 메서드는 작업자가 시작될 때 호출되고 반환 될 때 호출되지 않기 때문에 이것이라고 생각합니다.

사실인가요?

그렇다면 작업자가 작업을 완료했을 때 어떻게 알 수 있습니까?

편집 :이 문제를 해결할 수 없습니다. 그것은 말이되지 않습니다. 나는 내가 추가하고있는 목록을 생각하게되었다. 나는 그것에 추가 할 수 없었고, 나는 Dispatcher 쓰레드에 그것을 포장해야했다. 이것은 문제가되어야합니다, 그렇지? 내 비동기 메서드 StartScan()이 Dispatcher를 기다릴 수있는 방법이 있습니까?

미리 감사드립니다.

StartScan()

private void StartScan() 
    { 
     //For testing 
     for (int t = 0; t < 1; t++) 
     { 
      var app2 = Application.Current; 
      if (app2 != null) 
      { 
       app2.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
              new DispatcherOperationCallback(AddComputerToList), 
              new ComputerModel() 
               { 
                HostName = "Andreas-PC", 
                IpAddress = "192.168.1.99", 
                ActiveDirectoryPath = "ikke i AD", 
                Name = "Andreas-PC", 
                OperatingSystem = "Microsoft Windows 7 Enterprise" 
               }); 
      } 
     } 
    } 

ScanCompletedCallback()

 private void ScanCompletedCallback(IAsyncResult ar) 
    { 
     var worker = (ScanDelegate)((AsyncResult)ar).AsyncDelegate; 
     var async = (AsyncOperation)ar.AsyncState; 
     worker.EndInvoke(ar); 
     lock (_sync) 
     { 
      IsScanning = false; 
     } 

     var completedArgs = new AsyncCompletedEventArgs(null, false, null); 
     async.PostOperationCompleted(e => OnScanCompleted((AsyncCompletedEventArgs)e), completedArgs); 
    } 

AddComputerToList() 질문 콜백 ScanCompletedCallback의 완료에 발생에 대한 직접적인 답변으로

private object AddComputerToList(Object objComputer) 
    { 
     var computer = objComputer as ComputerModel; 
     if (computer != null) 
     { 
      ComputersList.Add(computer); 
      OnPropertyChanged("ComputersList"); 
     } 
     return null; 
    } 
+0

왜 실제로 시도해보고 실제로 호출되는지 확인하지 않으시겠습니까? – svick

+0

예, 목록에 추가하는 것은 콜백 후에 수행됩니다. 하지만 이것은 나에게 의미가 없으므로 콜백 메서드가 어떻게 작동하는지 묻는 것입니다. – Andreas

+0

방금 ​​원래 질문에 추가했습니다. 이것이 문제 일 수 있다고 생각하십시오. – Andreas

답변

0

.

이 시점에서 일부 데이터가 있어야한다고 생각되는 목록이 있으면 다른 오류가있는 것 같습니다. 더 많은 코드를 게시하면 도움이 될 것입니다.

+1

알았어. 알아 냈어. DispatcherThread에 대한 Invoke 대신 BeginInvoke를 호출하여 목록에 추가했습니다. 이로 인해 비동기식으로 실행 된 다음 초기 스레드가 해당 콜백을 호출했습니다. – Andreas