Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用任务时,如何使用上一个任务的结果继续使用另一个函数?_C#_.net_Multithreading - Fatal编程技术网

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

C# 使用任务时,如何使用上一个任务的结果继续使用另一个函数?,c#,.net,multithreading,C#,.net,Multithreading,我有一个WCF连接器,可以为我获取少量数据,通常需要20秒才能获取每个项目的数据(这很好)。我想使用Task为我获取数据,然后添加WinForm控件,其中包含来自此Task的值 我已经创建了包含这些数据的对象列表 使用第一个任务作为更新列表的任务,我希望在第一个任务完成后立即创建控件 这是迄今为止的代码: List<IpVersionCounter> ipVersionCounters = new List<IpVersionCounter>(); Task task =

我有一个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);
List ipVersionCounters=new List();
Task Task=Task.Factory.StartNew(()=>
{
foreach(var sitein settings.Sites)
{
字符串ip=site.ip;
字符串版本=“未定义”;
使用(WcfConnector WcfConnector=
WcfConnector.CreateConnectorWithoutException((ip)))
{
如果(wcfConnector!=null)
{
version=string.Format(“{0}{1}{2}”,
wcfConnector.VersionController.GetBranchName(),
wcfConnector.VersionController.GetBuildNumber(),
wcfConnector.VersionController.GetCurrentVersion());
}
}
计数器++;
添加(新的IpVersionCounter)
{
Ip=Ip,
版本=版本,
计数器=计数器
});
}
返回ipVersionCounters;
}).ContinueWith();
AddProgressBar(ipVersionCounter);

我不知道我的方法是否正确,也不知道如何使用ContinueWith将值从第一个方法传递到第二个方法。

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

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

如果要在UI线程上执行continuewith,请使用(如果要在UI线程上启动)


(摘自answer以获取更多信息)

我得到:跨线程操作无效:从创建控件“xPanel”的线程以外的线程访问控件“xPanel”。我想我无法从其他线程向该线程添加控件。有没有办法?您必须在UI线程上执行UI操作。您可以调用以获取在UI线程上执行任务的调度程序。接受这样的调度器。
Task.Factory.StartNew(() =>
{
  // Background work
}).ContinueWith((previousTask) => {
  // Update UI thread
}, TaskScheduler.FromCurrentSynchronizationContext());