Quand utiliser TaskEx.C. TaskEx.RunEx

J'essaie de comprendre quand utiliser TaskEx.Run. J'ai donné deux exemples de code que j'ai écrit ci-dessous qui produisent le même résultat. Ce que je n'arrive pas à voir, c'est pourquoi je voudrais prendre le de la Tâche.RunEx TaskEx.RunEx approche, je suis sûr qu'il y a une bonne raison, et espérais que quelqu'un pourrait me renseigner.

async Task DoWork(CancellationToken cancelToken, IProgress<string> progress)
{
    int i = 0;
    TaskEx.RunEx(async () =>
        {
            while (!cancelToken.IsCancellationRequested)
            {
                progress.Report(i++.ToString());
                await TaskEx.Delay(1, cancelToken);
            }
        }, cancelToken);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    if (button.Content.ToString() == "Start")
    {
        button.Content = "Stop";
        cts.Dispose();
        cts = new CancellationTokenSource();
        listBox.Items.Clear();
        IProgress<string> progress = new Progress<string>(s => 
        {
            listBox.Items.Add(s); 
            listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]);
        });
        DoWork(cts.Token, progress);
    }
    else
    {
        button.Content = "Start";
        cts.Cancel();
    }
}

Je peux obtenir les mêmes résultats comme

  async Task DoWork(CancellationToken cancelToken)
    {
        int i = 0;
        while (!cancelToken.IsCancellationRequested)
        {
            listBox.Items.Add(i++);
            listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]);
            await TaskEx.Delay(100, cancelToken);

        }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (button.Content.ToString() == "Start")
        {
            button.Content = "Stop";
            cts.Dispose();
            cts = new CancellationTokenSource();
            listBox.Items.Clear();
            DoWork(cts.Token);
        }
        else
        {
            button.Content = "Start";
            cts.Cancel();
        }
    }
Le fil au-dessus est une discussion sur les raisons de TaskEx.RunEx, son tout à voir avec les changements qui ne pourrait pas être mis dans le cœur .NET fonctionnalité pour le CTP, mais sera intégré correctement pour la version finale
Changé Task.RunEx à TaskEx.RunEx Il n'y a ni Run() ni RunEx() dans Async CTP Task classe. Ils sont tous les deux dans TaskEx. Corrigez-moi si je me trompe

OriginalL'auteur poco | 2012-02-17