¿Cuándo se invoca exactamente un método de devolución de llamada en una operación asincrónica?

Estoy agregando algunos datos a una lista y puede llevar un tiempo hacerlo. Por lo tanto, realizo esta acción de forma asincrónica. Lo hago así:

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

La información agregada en StartScan () se agrega correctamente a la lista. Cuando se completa el escaneo, quiero realizar un escaneo diferente, dependiendo de los datos de la lista. Entonces comienzo el escaneo diferente en el método ScanCompletedCallback (). Pero en este punto, mi lista está vacía. Supongo que esto se debe a que el método de devolución de llamada se invoca cuando se inicia el trabajador y no cuando regresa.

¿Es esto cierto?

Y si es así, ¿cómo puedo saber cuando mi trabajador ha completado sus tareas?

Editar: No puedo entender esto. No tiene sentido. Llegué a pensar en la lista a la que estoy agregando. No podía simplemente agregarle, tenía que envolverlo en un hilo de Dispatcher. Este debe ser el problema, ¿verdad? ¿Hay alguna manera de hacer que mi método Async StartScan () espere a este Dispatcher?

Gracias de antemano!

Iniciar escaneo()

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

preguntado el 27 de agosto de 11 a las 16:08

¿Por qué no lo prueba y averigua cuándo se llama realmente? -

Sí, puedo ver que la adición a la lista se lleva a cabo después de la devolución de llamada. Pero esto no tiene sentido para mí, así que solo preguntaba cómo se supone que funciona el método de devolución de llamada. -

Acabo de hacer una adición a mi pregunta original. Creo que este podría ser el problema. -

Por favor, muéstrenos el código que está invocando (StartScan y ScanCompletedCallback), ahí es donde probablemente radica el problema. -

1 Respuestas

Como respuesta directa a su pregunta, la devolución de llamada se producirá al finalizar ScanCompletedCallback.

Si tiene una lista que cree que debería tener algunos datos en este punto, entonces parece que hay algo más mal, publicar más código puede ayudar con esto.

Respondido 27 ago 11, 20:08

Está bien, lo descubrí. Resultó que había llamado BeginInvoke en lugar de solo Invoke en DispatcherThread, que se agregó a la lista. Esto hizo que se ejecutara de forma asíncrona, por supuesto, y luego el hilo inicial invocó su devolución de llamada. - Andreas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.