这是定期间隔异步下载的好代码吗?

时间:2016-12-30 04:02:18

标签: c# .net visual-studio timer task-parallel-library

我正在使用Windows服务定期检查更新。像一两分钟。为此,我使用.net 4.6.1和

  1. 系统计时器,&
  2. 任务
  3. 以下是我的代码

        /// <summary>
        /// Download updates from server
        /// </summary>
        /// <returns></returns>
        private void DownloadUpdate()
        {
            try
            {
                var package = string.Empty;
                if (_server != null)
                {
                    timer.Stop();
                    package = _server.Download();
                    if (package.Length > 0)
                        _server.Install(package);
                }
            }
    
            finally
            {
    
                timer.Start();
    
            }
    
        }
    
        /// <summary>
        /// To carry out download asynchronous way
        /// </summary>
        private async void DowloadUpdateAsync()
        {
           await Task.Run(()=>DownloadUpdate());
        }
    

    只是想知道,如果它是管理间隔的正确方法。

2 个答案:

答案 0 :(得分:0)

  1. 对于foreach (string folderPath in Directory.EnumerateDirectories(givenPath, searchFolder, SearchOption.AllDirectories)) { // iterating the list } 方法,如果您不希望它返回结果,请返回async。见this link

  2. Task可简化为Task.Run(()=>DownloadUpdate());

  3. 我真的看不出为什么需要用Task.Run(DownloadUpdate);方法包装任务。由于async不是异步的,它会阻塞一个线程,你需要做的就是将它作为DownloadUpdate运行或直接将它排队到线程池。

答案 1 :(得分:-1)

添加到Lifu的答案:

我建议你,你应该在ContinueWith()中启动计时器。

TPL使用垃圾收集器的终结机制来发现失败的任务何时被放弃导致异常未观察。发生这种情况时,TaskScheduler类会引发其UnobservedTaskException事件。最好处理您的例外情况。使用ContinueWith时这是好处。

尝试这样的事情:

    Timer timer = new Timer();
    public Program()
    {
        timer.Interval = 5000;
        timer.Elapsed += DownloadUpdate;
        timer.Enabled = true;
    }

    private void DownloadUpdate(object sender, ElapsedEventArgs e)
    {
        Task.Factory.StartNew((Action)DownloadUpdate).ContinueWith(t =>
        {
            bool shouldTimerStartAgain = true;
            if (t.IsFaulted)
            {
                // handle t.Exception
                // Compute if this task need to stop?
                // If so set shouldTimerStartAgain = false
            }
            if (shouldTimerStartAgain)
            {
                timer.Start();
            }
        });
    }

    private void DownloadUpdate()
    {
        var package = string.Empty;
        if (_server != null)
        {
            timer.Stop();
            package = _server.Download();
            if (package.Length > 0)
                _server.Install(package);
        }
    }