如何使用异步和等待定时器

本文关键字:等待 定时器 异步 何使用 | 更新日期: 2023-09-27 17:50:30

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

  1. 使用HttpWebRequest在一个线程中每3秒获取web请求/响应。(总共大约有10个线程来做这个web请求/响应)

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

我想使用System.Timers.Timer和async和await。但我不知道这是提高绩效的最佳方式。以及如何测试它们。我是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();
        }
    }
}