【问题标题】:how to repeat async call如何重复异步调用
【发布时间】:2022-07-25 04:49:08
【问题描述】:

我有一个程序在异步调用中执行简单的 http get 并将其写入控制台:

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

namespace Hello 
{
    class Program
    {
        private static readonly HttpClient client = new HttpClient();
       static async Task Main(string[] args)
        {
            await ProcessRepositories();
        }
        private static async Task ProcessRepositories()
        {
            client.DefaultRequestHeaders.Accept.Clear();
            var stringTask = client.GetStringAsync("https://localhost:8080");
            var msg = await stringTask;
            Console.Write(msg);                
        }
    }
}

如何重复整个过程以使其将其写入控制台,直到按下按钮?

谢谢!

【问题讨论】:

  • 想一想您的基本编程构建块,哪些基本概念允许您重复或循环某些代码部分?
  • 我想把它放在这样的while循环中:``` while (!Console.KeyAvailable) { Console.WriteLine("Loop"); } ``` 但它没有工作
  • @Sanchez82 it did not work 什么不起作用?在循环内调用ProcessRepositories 很简单。
  • 它给出了一个错误:未处理的异常。 System.InvalidOperationException:当任一应用程序没有控制台或控制台输入已从文件重定向时,无法查看是否按下了键。试试 Console.In.Peek。

标签: c# asp.net asynchronous


【解决方案1】:
class Program
{
    private static readonly HttpClient client = new HttpClient();
    static async Task Main(string[] args)
    {
        while (true)
        {
            var consoleKey = Console.ReadKey().Key;
            if (consoleKey == ConsoleKey.Enter) // if pressed Enter
                await ProcessRepositories();
            else if (consoleKey == ConsoleKey.Escape) // if pressed Esc
                break;
        }

        Console.WriteLine("Finish");
    }

    private static async Task ProcessRepositories()
    {
        client.DefaultRequestHeaders.Clear(); // idk why you cleaning headers, but OK
        Console.Write(await client.GetStringAsync("https://localhost:8080"));
    }
}

【讨论】:

  • 没有理由每次都清除默认标题 - 只是不要设置它们。如果每个调用需要不同的标头,则应使用GetAsync 而不是GetStringAsync
  • 这个收到以下错误:“未处理的异常。System.InvalidOperationException:当任一应用程序没有控制台或控制台输入已从文件重定向时,无法查看是否按下了键。试试 Console.In.Peek。”
  • @Sanchez82 检查更新的代码。在此解决方案中按 Enter 键调用 srv
【解决方案2】:

您可以使用Polly library 进行此类呼叫。不要使用无限循环,这是不好的做法。

这是一个关于retry with exponential backoff的例子。

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2018-09-05
    • 2022-11-26
    • 1970-01-01
    • 2020-05-07
    • 2016-09-07
    • 2018-09-22
    • 2014-12-21
    相关资源
    最近更新 更多