Wait for a while without blocking main thread

前端 未结 8 1019
慢半拍i
慢半拍i 2020-12-01 20:50

I wish my method to wait about 500 ms and then check if some flag has changed. How to complete this without blocking the rest of my application?

8条回答
  •  不知归路
    2020-12-01 21:25

    I've recently been struggling with the same issue where I needed an action to be run on schedule without blocking the UI.

    Here's my solution:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        RunOnSchedule(interval, cancellationToken);
    }
    
    private void RunOnSchedule(int interval, CancellationToken cancellationToken)
    {
        // Start the task you want to run on schedule
        TaskToRunOnSchedule(args);
        Task.Run(async () => 
        {
            // This loop checks if the task was requested to be cancelled every 1000 ms
            for (int x = 0; x < interval; x+=1000)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }
    
                await Task.Delay(1000);
            }
        }).GetAwaiter().OnCompleted(() =>
        {
            // Once the task for delaying is completed, check once more if cancellation is requested, as you will reach this point regardless of if it was cancelled or not.
            if (!cancellationToken.IsCancellationRequested)
            {
                // Run this method again
                RunOnSchedule(interval, cancellationToken);
            }
        });
    }
    

提交回复
热议问题