首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是用于定期异步下载的好代码吗?

这是用于定期异步下载的好代码吗?
EN

Stack Overflow用户
提问于 2016-12-30 04:02:17
回答 1查看 81关注 0票数 2

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

  1. 系统定时器&
  2. 任务

下面是我的代码

代码语言:javascript
复制
    /// <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());
    }

只是想知道,这是否是管理间隔的正确方法。

EN

回答 1

Stack Overflow用户

发布于 2016-12-30 09:41:36

补充了李福的回答:

我建议您在ContinueWith()中启动计时器。

TPL使用垃圾收集器的终结机制来发现何时放弃了失败的任务,从而导致异常为未观察到的。当发生这种情况时,TaskScheduler类将引发它的UnobservedTaskException事件。最好是处理你的异常。这是在使用ContinueWith时的加号。

试着做这样的事情:

代码语言:javascript
复制
    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);
        }
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41390436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档