我一直在考虑什么是在C#(.NET 4)中每x
毫秒实现定期(相对长时间运行)计算的最佳解决方案。
假设
x
是 10000(10 秒)。在这种情况下,最好的解决方案可能是
DispatcherTimer
每 10 秒滴答一次。
函数中void timer_Tick(object sender, EventArgs e)
只有启动的代码Task
(假设完成长时间运行的任务需要大约 5 秒)。timer_Tick
将立即退出,任务将忙于计算某些东西。x
<1000(1 秒)呢?Task
每 1 秒创建和启动一次会不会有很大的性能开销?
如果不是,时间限制是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
}
- 编辑: -
通过密集计算,我的意思是检查与指定服务器的连接是打开还是关闭。我想监控连接,以便在连接断开时提醒用户。
检查连接以这种方式实现(感谢Ragnar):
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;
}
}