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的
答案 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
并返回Task
或Task<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