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)
(这个答案取自更多信息)