UWP ThreadPoolTimer等到工作项完成

时间:2017-03-21 16:13:53

标签: c# timer uwp threadpool periodic-task

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

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

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

1 个答案:

答案 0 :(得分: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;
    }

这只是一个普遍的想法。