Подтвердить что ты не робот

Как продолжить с помощью другой функции с результатом предыдущей задачи при использовании задач?

У меня есть WCF-коннектор, который должен получить для меня небольшой объем данных, обычно для получения этих данных для каждого элемента требуется до 20 секунд (что хорошо). Я хочу использовать Task для получения данных для меня, а затем добавлять элементы управления WinForm со значениями из этих задач.

Я создал список объектов, которые будут содержать эти данные.

Используется первая задача как та, которая обновляет список, и я хочу, чтобы Task была сразу после первой задачи для создания элементов управления.

Это код до сих пор:

List<IpVersionCounter> ipVersionCounters = new List<IpVersionCounter>();
Task task = Task.Factory.StartNew(() =>
{
   foreach (var sitein settings.Sites)
   {
       string ip = site.ip;
       string version = "undefined";

       using (WcfConnector wcfConnector = 
                    WcfConnector.CreateConnectorWithoutException((ip)))
       {
           if (wcfConnector != null)
           {
               version= string.Format("{0} {1} {2}", 
               wcfConnector.VersionController.GetBranchName(), 
               wcfConnector.VersionController.GetBuildNumber(),
               wcfConnector.VersionController.GetCurrentVersion());
           }
       }
       counter++;
       ipVersionCounters.Add(new IpVersionCounter
                            {
                            Ip = ip,
                            Version = Version,
                            Counter = counter
                            });
    }
return ipVersionCounters;
}).ContinueWith();

AddProgressBar(ipVersionCounter);

Я не знаю, правильно ли я иду и как использовать ContinueWith для передачи значения от первого метода до второго.

4b9b3361

Ответ 1

В приведенном ниже примере previousTask ссылается на предыдущую задачу, используйте свойство Result, чтобы получить из него возвращаемое значение.

Task task = Task.Factory.StartNew(() =>
{
   // Background work
   return ipVersionCounters;
}).ContinueWith((previousTask) => 
{
   var ipVersionCounters = previousTask.Result;
});

Обновить

Если вы хотите, чтобы непрерывное выполнение выполнялось в потоке пользовательского интерфейса (если вы начинаете в потоке пользовательского интерфейса)...

Task.Factory.StartNew(() =>
{
  // Background work
}).ContinueWith((previousTask) => {
  // Update UI thread
}, TaskScheduler.FromCurrentSynchronizationContext());

(который был взят из этого ответа для получения дополнительной информации)