如何在.NET Core中正确处理异步方法

问题描述

我正在寻找一个网站回复,并同时将点发送到屏幕上。

我无法使用下面的代码来执行此操作。我确定我在做些愚蠢的事情,寻找任何见解。

Console.Write("Doing Task...");
HttpClient web = new HttpClient();
Task<HttpResponseMessage> resp = web.GetAsync("http://localhost",HttpCompletionoption.ResponseContentRead);
resp.RunSynchronously(); //Doesn't Work
resp.Start(); //Doesn't Work
while (resp.Status != TaskStatus.RanToCompletion)
{
    Write.Operation(".");
    Thread.Sleep(500);
}
Console.Write("Done!");

解决方法

您为什么不使用异步/等待?从C#7.1开始,main方法可以声明为异步。

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        Console.WriteLine("Doing Task...");
        using HttpClient client = new HttpClient();
        var resp = await client.GetAsync("http://localhost");
        var content = await resp.Content.ReadAsStringAsync();
        Console.WriteLine("Done!");
    }
}
,

您可以像下面的示例一样使用async / await来捕获.NET Core中从服务器返回的所有数据:

m = "a - b - c"
n = "c - b"
flag = False
array = n.split()
for elem in array:
    if elem not in m:
        flag = True
if flag is True:
    print("Not a sub string")
,

您的代码存在问题,因为您正在等待Task成功执行,但这可能永远不会发生。无论成功与否,您都需要等待其完成:

Console.Write("Doing Task...");
HttpClient httpClient = new HttpClient();
var task = httpClient.GetAsync("http://localhost");
while (!task.IsCompleted)
{
    Console.Write(".");
    Thread.Sleep(500);
}
task.Wait(); // observe any exceptions that may have occured
Console.WriteLine("Done!");

或者,您可以使用Wait重载来接受超时。这实际上更好,因为可以立即观察任务的完成,而不是随机地延迟0-500毫秒。

while (!task.Wait(500))
{
    Console.Write(".");
}
Console.WriteLine("Done!");