我一直在考虑在 C#(.NET 4)中每x
毫秒执行定期(相对长时间运行)计算的最佳解决方案。
假设x
为10000(10秒)。
在这种情况下,最好的解决方案可能是DispatcherTimer
,每10秒钟就会发出一次。
在void timer_Tick(object sender, EventArgs e)
函数中,只有启动Task
的代码(假设完成长时间运行任务需要约5秒钟)。
timer_Tick
将立即退出,任务将忙于计算某些事情。
x
<1000(1秒)怎么样?
不会有每1秒创建和启动Task
的巨大性能开销吗?
如果不是x
的时间限制?我的意思是:对于一些小的x
值,最好一直运行一个Task
,直到程序没有退出。在内部创建的任务中,DispatcherTimer
每x
秒调用相对长时间运行的函数(可能不是5秒但现在<1秒;但仍然相对较长)。
技术问题出现了:如何启动永远运行的Task
(直到程序运行)?除Dispatcher Timer
内Task
之外,我只需要x
,每个x
定期滴答(CancellationTokenSource CancelTokSrc = new CancellationTokenSource();
CancellationToken tok = CancelTokSrc.Token;
ConnCheckTask = new Task(() => { MyTaskMethod(tok); }, tok, TaskCreationOptions.LongRunning);
足够小)。
我试过这种方式:
void MyTaskMethod(CancellationToken CancToken)
{
MyTimer = new DispatcherTimer(); // MyTimer is declared outside this method
MyTimer.Interval = x;
MyTimer.Tick += new EventHandler(timer_Tick);
MyTimer.IsEnabled = true;
while (true) ; // otherwise task exits and `timer_Tick` will be executed in UI thread
}
private bool CheckConnection(String URL)
{
try
{
HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
request.Timeout = 15000;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return response.StatusCode == HttpStatusCode.OK ? true : false;
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
return false;
}
}
通过密集计算,我的意思是检查与指定服务器的连接是打开还是关闭。我想监视连接,以便在连接断开时提醒用户。
检查连接是以这种方式实现的(感谢 Ragnar ):
{{1}}