Cómo: administrar varios subprocesos en código administradoHow to: Managing Multiple Threads in Managed Code

Si tiene una extensión de VSPackage administrada que llama a métodos asincrónicos o tiene operaciones que se ejecutan en subprocesos distintos del subproceso de interfaz de usuario de Visual Studio, debe seguir las instrucciones que se indica a continuación.If you have a managed VSPackage extension that calls asynchronous methods or has operations that execute on threads other than the Visual Studio UI thread, you should follow the guidelines given below. Puede que el subproceso de interfaz de usuario siga respondiendo porque no es necesario esperar el trabajo en otro subproceso que se complete.You can keep the UI thread responsive because it doesn't need to wait for work on another thread to complete. Puede hacer que el código sea más eficaz, porque no tiene subprocesos adicionales que ocupan espacio de pila y lo hacer que sea más confiables y fáciles de depurar, puesto que evitar los interbloqueos y se bloquea.You can make your code more efficient, because you don't have extra threads that take up stack space, and you can make it more reliable and easier to debug because you avoid deadlocks and hangs.

En general, puede cambiar desde el subproceso de interfaz de usuario a un subproceso diferente, o viceversa.In general, you can switch from the UI thread to a different thread, or vice versa. Cuando el método vuelve, el subproceso actual es el subproceso de la que se llamó originalmente.When the method returns, the current thread is the thread from which it was originally called.

Importante

Las instrucciones siguientes utilizan las API en el Microsoft.VisualStudio.Threading espacio de nombres, en particular, la JoinableTaskFactory clase.The following guidelines use the APIs in the Microsoft.VisualStudio.Threading namespace, in particular, the JoinableTaskFactory class. Las API en este espacio de nombres son una Novedades de Visual Studio 2013.The APIs in this namespace are new in Visual Studio 2013. Puede obtener una instancia de un JoinableTaskFactory desde el ThreadHelper propiedad ThreadHelper.JoinableTaskFactory.You can get an instance of a JoinableTaskFactory from the ThreadHelper property ThreadHelper.JoinableTaskFactory.

Cambiar desde el subproceso de interfaz de usuario a un subproceso en segundo planoSwitching from the UI Thread to a Background Thread

  1. Si se encuentra en el subproceso de interfaz de usuario y desea hacer el trabajo asincrónico en un subproceso en segundo plano, use Task.Run():If you are on the UI thread and you want to do asynchronous work on a background thread, 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 se encuentra en el subproceso de interfaz de usuario y que desea bloquear de forma sincrónica mientras está realizando trabajo en un subproceso en segundo plano, use la TaskScheduler propiedad TaskScheduler.Default en Run:If you are on the UI thread and you want to synchronously block while you are performing work on a background thread, use the TaskScheduler property TaskScheduler.Default inside Run:

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

Cambio de un subproceso en segundo plano al subproceso de interfaz de usuarioSwitching from a Background Thread to the UI Thread

  1. Si se encuentra en un subproceso en segundo plano y desea realizar alguna acción en el subproceso de interfaz de usuario, use SwitchToMainThreadAsync:If you're on a background thread and you want to do something on the UI thread, use SwitchToMainThreadAsync:

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

    Puede usar el SwitchToMainThreadAsync método para cambiar al subproceso de interfaz de usuario.You can use the SwitchToMainThreadAsync method to switch to the UI thread. Este método envía un mensaje al subproceso de interfaz de usuario con la continuación del método asincrónico actual y también se comunica con el resto de subproceso framework para establecer la prioridad correcta y evitar los interbloqueos.This method posts a message to the UI thread with the continuation of the current asynchronous method, and also communicates with the rest of the threading framework to set the correct priority and avoid deadlocks.

    Si el método de subproceso de fondo no es asincrónico y no se puede convertir asincrónico, todavía puede usar el await sintaxis para cambiar al subproceso de interfaz de usuario ajustando el trabajo con Run, como en este ejemplo:If your background thread method isn't asynchronous and you can't make it asynchronous, you can still use the await syntax to switch to the UI thread by wrapping your work with Run, as in this example:

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