Partager via


Barres de progression pour les tâches en arrière-plan dans les extensions Visual Studio

Il existe plusieurs façons d’afficher la progression d’une tâche en arrière-plan en cours d’exécution dans Visual Studio. Voici comment utiliser des barres de progression à partir de vos propres extensions.

Barre d'état

La barre d’état a son propre indicateur de progression et il est l’endroit le plus simple pour afficher la progression à l’utilisateur. Il est visible, mais ne demande pas l’attention de l’utilisateur ou bloque sa tâche actuelle. La barre d’état est une bonne option pour la plupart des tâches en arrière-plan.

Animation of the status bar progress indicator in use.

L’utilisation de l’API pour afficher la progression de la barre d’état est assez simple :

await Task.Delay(1000); // long running task
await VS.StatusBar.ShowProgressAsync("Step 1/3", 1, 3);

await Task.Delay(1000); // long running task
await VS.StatusBar.ShowProgressAsync("Step 2/3", 2, 3);

await Task.Delay(1000); // long running task
await VS.StatusBar.ShowProgressAsync("Step 3/3", 3, 3);

// Progress ends as current step (3) and total steps (3) are equal

Boîte de dialogue d’attente threaded

La boîte de dialogue d’attente threaded (TWD) est une boîte de dialogue d’indicateur de progression qui s’affiche uniquement si la tâche en arrière-plan prend plus de x secondes spécifiées par l’extendeur. Il écrit la progression dans la barre d’état tout le temps, mais affiche la boîte de dialogue après x nombre de secondes en cours d’exécution.

The Threaded Wait Dialog showing progress.

Le TWD ne peut pas être affiché chaque fois que vous le souhaitez. Il est géré par Visual Studio de sorte qu’il n’interfère pas trop souvent avec l’utilisateur final. L’utilisation nécessite plus de code que simplement l’utilisation de la barre d’état, mais il s’agit toujours d’une API relativement simple à utiliser :

var fac = await VS.Services.GetThreadedWaitDialogAsync() as IVsThreadedWaitDialogFactory;
IVsThreadedWaitDialog4 twd = fac.CreateInstance();

twd.StartWaitDialog("Demo", "Working on it...", "", null, "", 1, true, true);

var totalSteps = 3;

for (var currentStep = 1; currentStep <= totalSteps; currentStep++)
{
    var text = $"Step {currentStep}/{totalSteps}";
    twd.UpdateProgress("In progress", text, text, currentStep, totalSteps, true, out _);

    await Task.Delay(1000); // long running task

    if (currentStep == totalSteps)
    {
        // Dismisses the dialog
        (twd as IDisposable).Dispose();
    }
}

Centre d’état des tâches

En bas à gauche de la barre d’état est le Centre d’état des tâches (TSC). Il est utilisé pour signaler la progression des tâches en arrière-plan longues et est utilisé par de nombreux services dans Visual Studio.

Task Status Center showing running background task.

L’API a plus de concepts que d’utiliser les autres méthodes d’affichage de la progression.

private async Task StartAsync()
{
    IVsTaskStatusCenterService tsc = await VS.Services.GetTaskStatusCenterAsync();

    var options = default(TaskHandlerOptions);
    options.Title = "My long running task";
    options.ActionsAfterCompletion = CompletionActions.None;

    TaskProgressData data = default;
    data.CanBeCanceled = true;

    ITaskHandler handler = tsc.PreRegister(options, data);
    Task task = LongRunningTaskAsync(data, handler);
    handler.RegisterTask(task);
}

private async Task LongRunningTaskAsync(TaskProgressData data, ITaskHandler handler)
{
    float totalSteps = 3;

    for (float currentStep = 1; currentStep <= totalSteps; currentStep++)
    {
        await Task.Delay(1000);

        data.PercentComplete = (int)(currentStep / totalSteps * 100);
        data.ProgressText = $"Step {currentStep} of {totalSteps} completed";
        handler.Progress.Report(data);
    }
}