如何在计时器中使用async和await

我的Windows应用程序的要求是:

  1. 使用HttpWebRequest在一个线程中每3秒获取一次Web请求/响应(总共大约有10个线程用于执行此Web请求/响应。)

  2. 每个线程使用一些全局变量。

我想使用System.Timers.Timer和async并等待。 但我不知道这是高性能的最佳方式。 然后如何测试它们。 我是C#的绿色。

你可以编写一个RepeatActionEvery()方法,如下所示。

它的参数是:

  • action – 你想要经常重复的动作。
  • interval – 调用action()之间的延迟间隔。
  • cancellationToken – 用于取消循环的标记。

这是一个可编辑的控制台应用程序,演示了如何调用它。 对于ASP应用程序,您可以从适当的位置调用它。

请注意,您需要一种取消循环的方法,这就是我将CancellationToken传递给RepeatActionEvery() 。 在此示例中,我使用取消源,在8秒后自动取消。 您可能必须提供一个取消源,其中一些其他代码在适当的时候调用.Cancel() 。 有关详细信息,请参见此处

 using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { sealed class Program { void run() { CancellationTokenSource cancellation = new CancellationTokenSource( TimeSpan.FromSeconds(8)); Console.WriteLine("Starting action loop."); RepeatActionEvery(() => Console.WriteLine("Action"), TimeSpan.FromSeconds(1), cancellation.Token).Wait(); Console.WriteLine("Finished action loop."); } public static async Task RepeatActionEvery(Action action, TimeSpan interval, CancellationToken cancellationToken) { while (true) { action(); Task task = Task.Delay(interval, cancellationToken); try { await task; } catch (TaskCanceledException) { return; } } } static void Main(string[] args) { new Program().run(); } } }