簡體   English   中英

UWP ThreadPoolTimer等到工作項完成

[英]UWP ThreadPoolTimer wait until work item finished

我需要實現一個定期計時器(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));
    }

問題是,如何才能等到“作業”完成然后再開始?

您可以做些不同。 但是代碼會更加清晰,無論如何您都將使用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;
    }

這只是一個總的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM