在单独的线程中定期更新数据(实际上是任务)

时间:2012-09-16 15:07:07

标签: c# wpf performance .net-4.0 task

我一直在考虑在 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秒)怎么样?

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

    技术问题出现了:如何启动永远运行的Task(直到程序运行)?除Dispatcher TimerTask之外,我只需要x,每个x定期滴答(CancellationTokenSource CancelTokSrc = new CancellationTokenSource(); CancellationToken tok = CancelTokSrc.Token; ConnCheckTask = new Task(() => { MyTaskMethod(tok); }, tok, TaskCreationOptions.LongRunning); 足够小)。
    我试过这种方式:

  3. 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}}

0 个答案:

没有答案