Как получить результат или возвращаемое значение задачи?



Может ли кто-нибудь объяснить мне, как вернуть результат задания?
В настоящее время я пытаюсь сделать следующее, Но мои задачи не возвращают мой список, который я ожидаю? В чем здесь проблема?



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

}
699   1  

1 ответ:

Чтобы вернуть результат из Task, необходимо определить Task как таковой: Task<TResult> и передать возвращаемый тип результата в качестве универсального параметра. (В противном случае задача ничего не вернет)

Например:

        // 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;
        });

Проблема в том, что вы не указываете, что задача будет возвращать что-либо.

Вы определили список задач, которые ничего не возвращают.

Что вам нужно будет сделать, так это указать тип возвращаемого значения в Task при определении Task как универсальный тип для List в вашем случае. Что-то вроде:

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

Вот как вы задаете тип возвращаемого значения для Task

Comments

    Ничего не найдено.