Когда именно CallbackMethod вызывается в асинхронной операции? - PullRequest
0 голосов
/ 27 августа 2011

Я добавляю некоторые данные в список, и это может занять некоторое время.Поэтому я выполняю это действие асинхронно.Я делаю это так:

ScanDelegate worker = StartScan;
AsyncCallback completedCallback = ScanCompletedCallback;
lock (_sync)
{
    var async = AsyncOperationManager.CreateOperation(null);
    worker.BeginInvoke(completedCallback, async);
}

Информация, добавленная в StartScan (), правильно добавлена ​​в список.Когда сканирование завершено, я хочу выполнить другое сканирование, в зависимости от данных в списке.Поэтому я запускаю другое сканирование в методе ScanCompletedCallback ().Но на данный момент мой список пуст.Я предполагаю, что это потому, что метод обратного вызова вызывается, когда рабочий запущен, а не когда он возвращается.

Это правда?

И если это так, как я могу знать, когдамой работник выполнил свои задачи?

Редактировать: Я не могу разобраться с этим.Это не имеет смысла.Я подумал о списке, к которому добавляю.Я не мог просто добавить к этому, мне пришлось обернуть его в ветке Dispatcher.Это должно быть проблемой, верно?Есть ли способ заставить мой метод Async StartScan () ждать этого диспетчера?

Заранее спасибо!

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

1 Ответ

0 голосов
/ 27 августа 2011

Как прямой ответ на ваш вопрос обратный вызов произойдет после завершения ScanCompletedCallback.

Если у вас есть список, который, по вашему мнению, должен содержать какие-то данные на данный момент, то, похоже, что-то не так, добавление еще кода может помочь с этим.

...