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

在Async操作上调用CallbackMethod的确切时间

作为对你问题的直接回答,回调将在ScanCompletedCallback完成时发生。

如果你有一个列表,你认为应该有一些数据在它在这一点上,那么似乎有其他的错误,张贴一些更多的代码可能有助于解决这个问题。