Gestire più thread nel codice gestito
Se si dispone di un'estensione VSPackage gestita che chiama metodi asincroni o dispone di operazioni eseguite su thread diversi dal thread dell'interfaccia utente di Visual Studio, è necessario seguire le linee guida riportate di seguito. È possibile mantenere reattivo il thread dell'interfaccia utente perché non è necessario attendere il completamento del lavoro su un altro thread. È possibile rendere il codice più efficiente, perché non si dispone di thread aggiuntivi che occupano spazio nello stack ed è possibile renderlo più affidabile e più semplice da eseguire perché si evitano deadlock e codice che non risponde.
In generale, è possibile passare dal thread dell'interfaccia utente a un thread diverso o viceversa. Quando il metodo termina, il thread corrente è il thread da cui è stato originariamente chiamato.
Importante
Le linee guida seguenti usano le API nello spazio dei Microsoft.VisualStudio.Threading nomi, in particolare la JoinableTaskFactory classe . Le API in questo spazio dei nomi sono nuove in Visual Studio 2013. È possibile ottenere un'istanza di da JoinableTaskFactory dalla ThreadHelper proprietà ThreadHelper.JoinableTaskFactory
.
Passare dal thread dell'interfaccia utente a un thread in background
Se si usa il thread dell'interfaccia utente e si vuole eseguire operazioni asincrone su un thread in background, usare
Task.Run()
:await Task.Run(async delegate{ // Now you're on a separate thread. }); // Now you're back on the UI thread.
Se si usa il thread dell'interfaccia utente e si vuole bloccare in modo sincrono mentre si esegue il lavoro su un thread in background, usare la TaskScheduler proprietà
TaskScheduler.Default
all'interno Rundi :// using Microsoft.VisualStudio.Threading; ThreadHelper.JoinableTaskFactory.Run(async delegate { await TaskScheduler.Default; // You're now on a separate thread. DoSomethingSynchronous(); await OrSomethingAsynchronous(); });
Passare da un thread in background al thread dell'interfaccia utente
Se si usa un thread in background e si vuole eseguire un'operazione nel thread dell'interfaccia utente, usare SwitchToMainThreadAsync:
// Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
È possibile usare il SwitchToMainThreadAsync metodo per passare al thread dell'interfaccia utente. Questo metodo invia un messaggio al thread dell'interfaccia utente con la continuazione del metodo asincrono corrente e comunica anche con il resto del framework di threading per impostare la priorità corretta ed evitare deadlock.
Se il metodo del thread in background non è asincrono e non è possibile renderlo asincrono, è comunque possibile usare la
await
sintassi per passare al thread dell'interfaccia utente eseguendo il wrapping del lavoro con Run, come in questo esempio:ThreadHelper.JoinableTaskFactory.Run(async delegate { // Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); // Do your work on the main thread here. });