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;
    }