0

我一直在考虑什么是在C#(.NET 4)中每x毫秒实现定期(相对长时间运行)计算的最佳解决方案。

  1. 假设x是 10000(10 秒)。

    在这种情况下,最好的解决方案可能是DispatcherTimer每 10 秒滴答一次。
    函数中void timer_Tick(object sender, EventArgs e)只有启动的代码Task(假设完成长时间运行的任务需要大约 5 秒)。
    timer_Tick将立即退出,任务将忙于计算某些东西。

  2. x<1000(1 秒)呢?

    Task每 1 秒创建和启动一次会不会有很大的性能开销?
    如果不是,时间限制是x多少?我的意思是:对于一些小的x值,最好一直启动一个Task运行,直到程序不退出。在创建的任务内部,DispatcherTimer每秒都会x调用相对较长的运行函数(可能不是 5 秒,但现在 <1 秒;但仍然相对较长)。

    技术问题来了:如何启动Task将永远运行的程序(直到程序运行)?我只需要Dispatcher Timer在 内部Task,定期滴答xx足够小)。
    我试过这样:

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;
    }
}
4

0 回答 0