【问题标题】:UWP ThreadPoolTimer wait until work item finishedUWP ThreadPoolTimer 等待工作项完成
【发布时间】:2017-03-22 00:38:42
【问题描述】:

我需要实现一个周期性计时器(10 秒),它将检查一些更改并更新数据库和 UI。我需要等到“作业”完成,然后再次启动计时器。我打电话给

timer.Cancel()

在“作业”开始时,然后在完成时再次创建计时器。但似乎当我使用使用 async 关键字的工作项处理程序时,线程池工作项可能会在处理程序中的所有代码执行之前设置为完整状态。 查看完整代码:

    private bool IsStop = false;

    private async Task  DoWork()
    {
        try
        {
            if (IsStop)
            {
                Stop();
                return;
            }
            timer.Cancel();
            var resultIds = await DB.getUnresolvedData();

            if (resultIds.IsNullOrEmpty())
            {
                return;
            }
            var json = await server.RequestSTatus(resultIds);

            if (string.IsNullOrEmpty(json))
                return;
            Model result = JsonConvert.DeserializeObject<Model>(json);
            UpdateDB(result);
        }

        catch (Exception ex)
        {

        }

        finally
        {
            Start();
        }
    }

    public void Start()
    {
        if (IsStop) return;

        timer = ThreadPoolTimer.CreatePeriodicTimer(async (t) =>
        {
            await DoWork();
        }, TimeSpan.FromSeconds(10));
    }

问题是,我怎样才能等到“工作”完成后再重新开始?

【问题讨论】:

    标签: c# timer uwp threadpool periodic-task


    【解决方案1】:

    你可以做一些不同的事情。但代码会更清晰,无论如何你都会使用 ThreadPool。只需将 Task.Delay 用于计时器。像这样。

        private bool isRunning;
    
        public async void Start()
        {
            if (isRunning)
                return;
    
            isRunning = true;
            while (isRunning)
            {
                await DoWork();
                //wait period.
                await Task.Delay(TimeSpan.FromSeconds(10));
                if (!isRunning)
                    return;
            }
        }
    
        private async Task DoWork()
        {
            //Do your work here.
        }
    
        public void Stop()
        {
            isRunning = false;
        }
    

    这只是一个大概的想法。

    【讨论】:

    • 我使用private bool IsStop = false; 来阻止全球工作者,例如应用暂停中的Pause()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多