Compartir vía


Administración de varios subprocesos en código administrado

Si tiene una extensión VSPackage administrada que llama a métodos asincrónicos o tiene operaciones que se ejecutan en subprocesos distintos del subproceso de la interfaz de usuario de Visual Studio, debe seguir las instrucciones que se indican a continuación. Puede mantener la capacidad de respuesta del subproceso de interfaz de usuario porque no es necesario esperar a que se complete el trabajo en otro subproceso. Puede hacer que el código sea más eficaz, ya que no tiene subprocesos adicionales que ocupan espacio de pila y puede facilitar la depuración porque evita interbloqueos y código que no responde.

En general, puede cambiar del subproceso de la interfaz de usuario a otro subproceso o viceversa. Cuando el método devuelve, el subproceso actual es el subproceso desde el que se llamó originalmente.

Importante

Las instrucciones siguientes usan las API en el Microsoft.VisualStudio.Threading espacio de nombres, en particular, la JoinableTaskFactory clase . Las API de este espacio de nombres son nuevas en Visual Studio 2013. Puede obtener una instancia de desde JoinableTaskFactory la ThreadHelper propiedad ThreadHelper.JoinableTaskFactory.

Cambiar del subproceso de la interfaz de usuario a un subproceso en segundo plano

  1. Si está en el subproceso de la interfaz de usuario y desea realizar un trabajo asincrónico en un subproceso en segundo plano, use Task.Run():

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. Si está en el subproceso de la interfaz de usuario y desea bloquear sincrónicamente mientras realiza el trabajo en un subproceso en segundo plano, use la TaskScheduler propiedad TaskScheduler.Default dentro Runde :

    // using Microsoft.VisualStudio.Threading;
    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        await TaskScheduler.Default;
        // You're now on a separate thread.
        DoSomethingSynchronous();
        await OrSomethingAsynchronous();
    });
    

Cambiar de un subproceso en segundo plano al subproceso de interfaz de usuario

  1. Si está en un subproceso en segundo plano y quiere hacer algo en el subproceso de interfaz de usuario, use SwitchToMainThreadAsync:

    // Switch to main thread
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
    

    Puede usar el SwitchToMainThreadAsync método para cambiar al subproceso de la interfaz de usuario. Este método envía un mensaje al subproceso de la interfaz de usuario con la continuación del método asincrónico actual y también se comunica con el resto del marco de subprocesos para establecer la prioridad correcta y evitar interbloqueos.

    Si el método de subproceso en segundo plano no es asincrónico y no puede hacerlo asincrónico, puede seguir usando la await sintaxis para cambiar al subproceso de la interfaz de usuario ajustando el trabajo con Run, como en este ejemplo:

    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        // Switch to main thread
        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
        // Do your work on the main thread here.
    });