일부 데이터를 목록에 추가 중이며이를 수행하는 데 다소 시간이 걸릴 수 있습니다. 따라서이 작업을 비동기 적으로 수행합니다. 나는 이것을 좋아한다 :비동기 작업에서 호출 된 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;
}
왜 실제로 시도해보고 실제로 호출되는지 확인하지 않으시겠습니까? – svick
예, 목록에 추가하는 것은 콜백 후에 수행됩니다. 하지만 이것은 나에게 의미가 없으므로 콜백 메서드가 어떻게 작동하는지 묻는 것입니다. – Andreas
방금 원래 질문에 추가했습니다. 이것이 문제 일 수 있다고 생각하십시오. – Andreas