Partager via


IVsDataHostService.InvokeOnUIThread, méthode

Exécute de façon synchrone une méthode spécifiée sur l'exécution principal du thread dans le processus de Visual Studio, avec la liste spécifiée d'arguments.

Espace de noms :  Microsoft.VisualStudio.Data.Core
Assembly :  Microsoft.VisualStudio.Data.Core (dans Microsoft.VisualStudio.Data.Core.dll)

Syntaxe

'Déclaration
Function InvokeOnUIThread ( _
    method As Delegate, _
    ParamArray args As Object() _
) As Object
Object InvokeOnUIThread(
    Delegate method,
    params Object[] args
)
Object^ InvokeOnUIThread(
    Delegate^ method, 
    ... array<Object^>^ args
)
abstract InvokeOnUIThread : 
        method:Delegate * 
        args:Object[] -> Object
function InvokeOnUIThread(
    method : Delegate, 
    ... args : Object[]
) : Object

Paramètres

  • method
    Type : Delegate

    Délégué vers une méthode qui accepte des paramètres du même nombre et du même type que ceux qui sont contenus dans le paramètre args.

  • args
    Type : array<Object[]

    Tableau d'objets à passer comme arguments à la méthode spécifiée. Ce paramètre peut être nullune référence null (Nothing en Visual Basic) si la méthode n'accepte aucun argument.

Valeur de retour

Type : Object
Object qui contient la valeur de retour du délégué appelé ou nullune référence null (Nothing en Visual Basic) si le délégué n'a pas de valeur de retour.

Exceptions

Exception Condition
[any]

La méthode spécifiée a levé une exception.

Notes

Cette méthode est utile pour les scénarios multithreads qui effectuent la majorité de travail sur un thread d'arrière-plan mais doit régulièrement exécuter du code qui s'exécute uniquement sur le thread d'interface utilisateur. Un tel code inclut des services globaux d'accès de Visual Studio, en particulier ceux implémentés en tant que composants COM monothread en code natif.

Lorsqu'elle est appelée, cette méthode ajoute un message à la file d'attente de messages des fenêtres du thread d'interface utilisateur, qui fait appel à traiter la méthode spécifiée. Cette méthode est synchrone, ce qui signifie que le thread appelant est bloqué jusqu'à ce que le thread d'interface utilisateur a fini de traiter la méthode.

Avertissement

Appeler cette méthode lorsque le thread d'interface utilisateur attend un verrou sur un objet que le thread appelant actuellement verrouillé provoque un interblocage dans le processus.Les meilleures pratiques suivantes pour verrouiller entre les threads aideront à réduire l'occurrence de ce problème.

Exemples

Le code suivant illustre l'utilisation de cette méthode à appeler un service natif Visual Studio qui n'est pas accessible à partir d'un thread d'arrière-plan.

using System;
using System.Threading;
using Microsoft.VisualStudio.Data.Core;
using Microsoft.VisualStudio.Shell.Interop;

public class DdexHostSvcExample7
{
    public static void UpdateUI(IVsDataHostService hostService)
    {
        if (hostService.UIThread == Thread.CurrentThread)
        {
            // Called on UI thread, directly call method
            ActuallyUpdateUI(hostService);
        }
        else
        {
            // Called from background thread, invoke on UI thread
            hostService.InvokeOnUIThread(
                new UpdateUIDelegate(ActuallyUpdateUI),
                hostService);
        }
    }

    private delegate void UpdateUIDelegate(IVsDataHostService hostService);

    private static void ActuallyUpdateUI(IVsDataHostService hostService)
    {
        IVsUIShell uiShell = hostService.GetService<IVsUIShell>();
        uiShell.UpdateCommandUI(0); // fImmediateUpdate == false
    }
}

Sécurité .NET Framework

Voir aussi

Référence

IVsDataHostService Interface

Microsoft.VisualStudio.Data.Core, espace de noms