如何正确使用任务

本文关键字:任务 何正确 | 更新日期: 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自身并返回TaskTask<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;