web-dev-qa-db-fra.com

Obtenir une valeur de retour de Task.Run

J'ai le code suivant ici

    public static async Task<string> Start(IProgress<ProcessTaskAsyncExProgress> progress)
    {
        const int total = 10;
        for (var i = 0; i <= total; i++)
        {
            await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture)));
            if (progress != null)
            {
                var args = new ProcessTaskAsyncExProgress
                {
                    ProgressPercentage = (int)(i / (double)total * 100.0),
                    Text = "processing " + i
                };
                progress.Report(args);
            }
        }
        return "Done";
    }

    private static string RunLongTask(string taskName)
    {
        Task.Delay(300);
        return taskName + "Completed!";
    }

Dans cette ligne:

await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture)));

Comment récupérer la valeur de chaîne de RunLongTask?

J'ai essayé

var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))).Result;

Mais j'obtiens une erreur "la chaîne n'est pas attendue"

39
Null Reference

Supprimez le Result de la fin. Lorsque vous await, vous obtiendrez le Result de la méthode attendue.

var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture)));
67
Haris Hasan

Ce n'est pas une réponse directe à une vieille question, mais pour d'autres qui cherchent:

"Normalement" vous ne devriez pas le faire, mais vous devez parfois faire correspondre une API de bibliothèque pour pouvoir utiliser une fonction d'encapsulation comme ci-dessous:

private async Task<string> WrapSomeMethod(string someParam)
{
    //adding .ConfigureAwait(false) may NOT be what you want but google it.
    return await Task.Run(() => SomeObj.SomeMethodAsync(someParam)).ConfigureAwait(false);
}

Et ensuite, appelez-le à la place avec .Result, comme ci-dessous:

string blah = WrapSomeMethod(someParam).Result;
10
Darren