如何在使用任务时使用上一个任务的结果继续使用另一个函数?

eug*_*neK 29 .net c# multithreading

我有WCF连接器,应该为我获取一些少量数据,通常需要20秒才能获得每个项目的数据(这很好).我想使用Task为我获取数据,然后使用此任务中的值添加WinForm控件.

我已经创建了包含这些数据的对象列表.

首先使用Task作为更新列表的任务,我想要在第一个Task完成创建控件后立即执行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);
Run Code Online (Sandbox Code Playgroud)

我不知道我是否正确的方式以及如何使用ContinueWith将值从第一种方法传递到第二种方法.

Pau*_*ulB 54

在下面的示例中,t引用上一个任务,使用Result属性从中获取返回值.

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

更新

如果你想在UI线程上使用continuewith执行(如果你是在UI线程上启动的话)...

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

(这个答案取自更多信息)

  • 您必须在UI线程上执行UI操作.您可以调用[TaskScheduler.FromCurrentSynchronizationContext](http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.fromcurrentsynchronizationcontext.aspx)来获取在UI线程上执行任务的调度程序.[Task.ContinueWith](http://msdn.microsoft.com/en-us/library/dd321307.aspx)接受这样的调度程序. (6认同)