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

时间:2014-03-17 08:18:16

标签: c# multithreading asynchronous httpwebrequest async-await

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

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

  2. 每个帖子都使用一些全局变量。

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

1 个答案:

答案 0 :(得分:21)

您可以按如下方式编写RepeatActionEvery()方法。

它的参数是:

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

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

请注意,您需要一种取消循环的方法,这就是我将CancellationToken传递给RepeatActionEvery()的原因。在此示例中,我使用取消源,在8秒后自动取消。您可能必须在适当的时间提供一个取消源,其中一些其他代码称为.Cancel()See here for more details.

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();
        }
    }
}
相关问题