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