如何正确使用任务
本文关键字:任务 何正确 | 更新日期: 2023-09-27 18:26:23
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 "等待"运算符只能在异步中使用 方法。考虑使用"异步"修饰符标记此方法,并 将其返回类型更改为"任务"。 服务器管理器
严重性代码说明项目文件行抑制状态 错误 CS0029 无法隐式转换类型 'System.Threading.Tasks.Task>" 自 'System.Threading.Tasks.Task' ServerManager
查看您的PingAsync
方法签名。它返回什么? Task<List<PingReply>>
.添加async
关键字不会更改该类型,假设它基本上允许您在方法中使用await
。
因此,通过调用 PingAsync
,您可以获得一个类型 Task<List<PingReply>>
的对象,并尝试将其分配给 List<string>
引用 - 这会产生类型不匹配错误。
但是,您可能会问,如何获得实际的T
形式Task<T>
?你应该简单地使用 await
,就像你在调用 Task.WhenAll
的方法中所做的那样。
List<PingReply> data = await PingAsync();
错误消息本身非常清楚。方法签名返回一个Task<List<PingReply>>
,但由于某种原因,你希望它返回一个List<string>
或Task<PingReply>
,不知道为什么。
您应该注意,在代码中开始使用async
会使其像瘟疫一样传播。这意味着调用异步方法的更高级别方法通常需要async
自身并返回Task
或Task<T>
。
给定这个异步函数
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();
}
从对象的其他部分调用,接受 TASK 包装的值
Task<List<PingReply>> foo = PingAsync();
然后手动等待它出来...
foo.Wait();
然后提取值
List<PingReply> bar = foo.Result;