如何在计时器中使用async和await
我的Windows应用程序的要求是:
-
使用HttpWebRequest在一个线程中每3秒获取一次Web请求/响应(总共大约有10个线程用于执行此Web请求/响应。)
-
每个线程使用一些全局变量。
我想使用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(); } } }