如何获取任务的结果或返回值?

23

有人能给我解释一下如何返回一个Task的结果吗? 我现在正在尝试做以下操作,但我的Tasks没有返回我期望的列表?这里有什么问题吗?

static void Main()
{
    List<Task> tasks = new List<Task>();
    List<string> sha256_hashes = new List<string>();
    List<string> results = new List<string>();

    sha256_hashes.Add("hash00");
    sha256_hashes.Add("hash01");
    sha256_hashes.Add("hash03");
    foreach(string sha256 in sha256_hashes)
    {
        string _sha256 = sha256;
        var task = Task.Factory.StartNew(() => GetAdditionalInfo(_sha256));
        tasks.Add(task);
    }
    Task.WaitAll(tasks.ToArray());
   //I want to put all the results of each task from tasks but the problem is
   //I can't use the Result method from the _task because Result method is not available
   //below is my plan to get all the results:
   foreach(var _task in tasks)
   {
        if(_task.Result.Count >= 1)  //got an error Only assignment, call, increment, dec....
             results.AddRange(_task.Result); //got an error Only assignment, call, increment, dec....
   }

   //Do some work about results
}
static List<string> GetAdditionalInfo(string hash)
{
    //this code returns information about the hash in List of strings

}

2
Task.Result 不是数组。 - Hamlet Hakobyan
3
Task 没有 Result 属性 - 看起来 tasks 应该是类型为 List<Task<List<string>>> - Lee
1个回答

28

要从一个 Task 返回结果,您需要将 Task 定义为这样:Task<TResult>,并将结果的返回类型作为泛型参数传递。(否则,Task 将返回空值)

例如:

        // Return a value type with a lambda expression
        Task<int> task1 = Task<int>.Factory.StartNew(() => 1);
        int i = task1.Result;

        // Return a named reference type with a multi-line statement lambda.
        Task<Test> task2 = Task<Test>.Factory.StartNew(() =>
        {
            string s = ".NET";
            double d = 4.0;
            return new Test { Name = s, Number = d };
        });
        Test test = task2.Result;

        // Return an array produced by a PLINQ query
        Task<string[]> task3 = Task<string[]>.Factory.StartNew(() =>
        {
            string path = @"C:\Users\Public\Pictures\Sample Pictures\";
            string[] files = System.IO.Directory.GetFiles(path);

            var result = (from file in files.AsParallel()
                          let info = new System.IO.FileInfo(file)
                          where info.Extension == ".jpg" 
                          select file).ToArray();

            return result;
        });

问题在于您没有指定任务将返回什么内容

您定义了一个不返回任何内容的任务列表。

您需要在定义List的泛型类型为Task时,指定Task的返回类型。例如:

var taskLists = new List<Task<List<string>>>();

这是如何指定 Task 的返回类型。


2
从微软网站直接获取的笑话: https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-return-a-value-from-a-task - user153923

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接