如何正确使用任务?

时间:2015-12-11 13:43:05

标签: c# task

private async Task<List<PingReply>> PingAsync()
{
    Ping pingSender = new Ping();
    var tasks = serverNames.Select(ip => pingSender.SendPingAsync(ip, 2000));
    var results = await Task.WhenAll(tasks);

    return results.ToList();
}

我的问题是如何执行此方法?

我已经尝试了

 List<string> data = PingAsync();

但我收到此错误消息

Error   CS0029  Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Collections.Generic.List<System.Net.NetworkInformation.PingReply>>' to 'System.Collections.Generic.List<string>' ServerManager   

我正在尝试ping服务器并更新UI,以便我们可以监控服务器。

我也试过这些

        Task<PingReply> longRunningTask = PingAsync();
        PingReply result = await longRunningTask;

错误

  

严重级代码描述项目文件行抑制状态   错误CS4033等待&#39;运算符只能在异步中使用   方法。考虑使用&#39; async&#39;标记此方法。修饰语和   将其返回类型更改为“任务”#39; ServerManager

     

严重级代码描述项目文件行抑制状态   错误CS0029无法隐式转换类型   &#39;&System.Threading.Tasks.Task GT;&#39;   至   &#39; System.Threading.Tasks.Task&#39; ServerManager的

3 个答案:

答案 0 :(得分:4)

查看您的PingAsync方法签名。它返回了什么? Task<List<PingReply>>。添加async关键字不会改变该类型,假设它基本上允许您在方法中使用await

因此,通过调用PingAsync,您会得到Task<List<PingReply>>类型的对象,并尝试将其分配给List<string>引用 - 这会为您提供类型不匹配错误。

但是,您可能会问,如何获得实际的T表单Task<T>?您应该只使用await,就像在调用Task.WhenAll的方法中一样。

List<PingReply> data = await PingAsync();

答案 1 :(得分:1)

错误消息本身非常清楚。方法签名返回Task<List<PingReply>>,但出于某种原因,您希望它返回List<string>Task<PingReply>,不确定原因。

您应该注意,在代码中使用async会使其像瘟疫一样传播。这意味着调用异步方法的更高级别方法通常需要async并返回TaskTask<T>

答案 2 :(得分:0)

鉴于此异步功能

 Task<List<PingReply>> foo = PingAsync();

从对象的其他部分调用,接受TASK包装值

foo.Wait();

然后手动等待......

List<PingReply> bar = foo.Result;

然后提取值

WITH LakesWithIslands AS (
SELECT DISTINCT IslandIn.lake, Lake.area, geo_lake.country
FROM ((IslandIn
INNER JOIN Lake ON IslandIn.lake = Lake.name)
INNER JOIN geo_lake ON IslandIn.lake = geo_lake.lake)
WHERE IslandIn.lake IS NOT NULL
) 

SELECT B.continent, (B.percentage/100)*SUM(A.area)
FROM LakesWithIslands as A
INNER JOIN encompasses as B ON A.country = B.country
GROUP BY B.continent, B.percentage