2011-08-27 8 views
0

リストにデータを追加していますが、これを行うにはしばらく時間がかかることがあります。したがって、私はこのアクションを非同期に実行します。私は次のようにします:Async操作で呼び出されたCallbackMethodは正確にいつですか?

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

StartScan()で追加された情報がリストに正しく追加されています。スキャンが完了したら、リスト内のデータに応じて別のスキャンを実行します。そこで、ScanCompletedCallback()メソッドで異なるスキャンを開始します。しかし、この時点で私のリストは空です。これは、ワーカーが開始されたときにコールバックメソッドが呼び出され、コールバックメソッドが返されるときではないからです。

これは本当ですか?

もしそうなら、私の労働者がその仕事を完了したことをどのように知ることができますか?

編集:私はこの周りに私の頭を得ることはできません。それは意味をなさない。私は私が追加しているリストを考えるようになった。私はそれに単に追加することはできませんでした、私はDispatcherスレッドでそれをラップする必要がありました。これは問題でなければなりません。 AsyncメソッドStartScan()がこのDispatcherを待つことができる方法はありますか?

ありがとうございます!コールバックがScanCompletedCallbackの完了時に発生しますあなたの質問に直接答えとして

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()

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

関連する問題