Synchronous Wait Without Blocking the UI-Thread

前端 未结 2 905
忘了有多久
忘了有多久 2020-12-05 16:27

Is there a synchronous wait function that won\'t tie up the UI-thread in .NET WPF? Something like:

Sub OnClick(sender As Object, e As MouseEventArgs) Handle         


        
相关标签:
2条回答
  • 2020-12-05 17:06

    You can use a DispatcherTimer for that sort of thing.

    Edit: This might do as well...

    private void Wait(double seconds)
    {
        var frame = new DispatcherFrame();
        new Thread((ThreadStart)(() =>
            {
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                frame.Continue = false;
            })).Start();
        Dispatcher.PushFrame(frame);
    }
    

    (Dispatcher.PushFrame documentation.)


    Starting with .NET 4.5 you can use async event handlers and Task.Delay to get the same behaviour. To simply let the UI update during such a handler return Dispatcher.Yield.

    0 讨论(0)
  • 2020-12-05 17:12

    Here is a solution with Task.Delay. I'm using it in unit-tests for ViewModels that use DispatcherTimer.

    var frame = new DispatcherFrame();
    
    var t = Task.Run(
        async () => {
            await Task.Delay(TimeSpan.FromSeconds(1.5));
            frame.Continue = false;
        });
    
    Dispatcher.PushFrame(frame);
    
    t.Wait();
    
    0 讨论(0)
提交回复
热议问题