在Async操作上调用CallbackMethod的确切时间
本文关键字:时间 CallbackMethod Async 操作上 调用 | 更新日期: 2023-09-27 18:06:53
我正在向列表添加一些数据,这可能需要一段时间才能做到这一点。因此,我异步执行此操作。我是这样做的:
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 ()
private object AddComputerToList(Object objComputer)
{
var computer = objComputer as ComputerModel;
if (computer != null)
{
ComputersList.Add(computer);
OnPropertyChanged("ComputersList");
}
return null;
}
作为对你问题的直接回答,回调将在ScanCompletedCallback完成时发生。
如果你有一个列表,你认为应该有一些数据在它在这一点上,那么似乎有其他的错误,张贴一些更多的代码可能有助于解决这个问题。