C# 什么时候在异步操作上调用回调方法?
我正在向列表中添加一些数据,这样做可能需要一些时间。因此,我异步执行此操作。我是这样做的:C# 什么时候在异步操作上调用回调方法?,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我正在向列表中添加一些数据,这样做可能需要一些时间。因此,我异步执行此操作。我是这样做的: ScanDelegate worker = StartScan; AsyncCallback completedCallback = ScanCompletedCallback; lock (_sync) { var async = AsyncOperationManager.CreateOperation(null); worker.BeginInvoke(completedCallba
ScanDelegate worker = StartScan;
AsyncCallback completedCallback = ScanCompletedCallback;
lock (_sync)
{
var async = AsyncOperationManager.CreateOperation(null);
worker.BeginInvoke(completedCallback, async);
}
StartScan()中添加的信息已正确添加到列表中。扫描完成后,我想根据列表中的数据执行不同的扫描。因此,我在ScanCompletedCallback()方法中启动不同的扫描。但在这一点上,我的列表是空的。我猜这是因为回调方法是在worker启动时调用的,而不是在它返回时调用的
这是真的吗
如果是,我如何知道我的员工何时完成了任务
编辑:我没法想清楚这件事。这没有道理。我想到了我要加入的名单。我不能只是添加到它,我必须将它包装在一个调度程序线程中。这一定是问题所在,对吗?有没有办法让我的异步方法StartScan()等待此调度器
提前谢谢
StartScan()
AddComputerToList()
作为对您问题的直接回答,回调将在ScanCompletedCallback完成时发生
如果您有一个列表,您认为该列表此时应该包含一些数据,那么似乎还有其他问题,发布更多代码可能会有所帮助。为什么不尝试一下,看看它实际上是在什么时候调用的?是的,我可以确定添加到列表中是在回调之后进行的。但这对我来说毫无意义,所以我只是问回调方法应该如何工作。我只是对我原来的问题做了一个补充。我想这可能是问题所在。请告诉我们您正在调用的代码(
StartScan
和scanpletedcallback
),这可能就是问题所在。好的,我已经解决了。事实证明,我调用了BeginInvoke,而不是添加到列表中的DispatcherThread上的Invoke。当然,这使它异步运行,然后初始线程调用其回调。
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"
});
}
}
}
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);
}
private object AddComputerToList(Object objComputer)
{
var computer = objComputer as ComputerModel;
if (computer != null)
{
ComputersList.Add(computer);
OnPropertyChanged("ComputersList");
}
return null;
}