我的Windows应用程序的要求是:
使用HttpWebRequest在一个线程中每3秒获取一次Web请求/响应。(总共大约有10个线程用于执行此Web请求/响应。)
每个帖子都使用一些全局变量。
我想使用System.Timers.Timer和async并等待。但我不知道这是高性能的最佳方式。然后如何测试它们。我是C#的绿色。
答案 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();
}
}
}