none
关于Task RRS feed

  • 问题

  • 点击2个按钮,分别使用new Task和Task.Run,但结果完全不一样

    第一个按钮里面的t1.Wait()不生效;

    第二个按钮不能和第一个按钮一样不停的点,不管有没有await Task.Delay(3000);都不能点,阻塞的。

    为啥啊?

    private async void btn_task1_Click(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("btn_task1_Click++++++++++++++++++++");
        Task t1 = new Task(async () =>
        {
            Debug.WriteLine("Task 1 running..");
            await Task.Delay(2000);
            Debug.WriteLine("Task 1 end");
        });
    
        Debug.WriteLine("Task 1 start");
        t1.Start();
        Debug.WriteLine("Task 1 wait");
        t1.Wait();
    
        Debug.WriteLine("btn_task1_Click delay 3s");
        await Task.Delay(3000);
        Debug.WriteLine("btn_task1_Click--------------------------------------");
    }
    
    private async void btn_task2_Click(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("btn_task2_Click++++++++++++++++++++");
        Task t2 = Task.Run(async () =>
        {
            Debug.WriteLine("Task 2 running..");
            await Task.Delay(2000);
    
            Debug.WriteLine("Task 2 end");
        });
    
        Debug.WriteLine("Task 2 wait");
        t2.Wait();
    
        Debug.WriteLine("btn_task2_Click delay 3s");
        await Task.Delay(3000);
        Debug.WriteLine("btn_task2_Click--------------------------------------");
    }

    2015年12月24日 16:33

答案

  • 您好,

    我查了下Task的源代码,可以看到用Task.Run()创建的Task,它涉及到一个异步链的问题,当你wait()的时候,它会等Task.Run()里面的异步执行完后再接着执行下面的代码。因此才会出现你说的UI阻塞的问题。

    如果你一定要用Task.Run()创建Task,你可以在Task外面在包装一个Dispatcher

    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { 
            //your task
    });


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年1月8日 9:26
    版主

全部回复

  • 第二个Task是不是在UI线程上执行的,有没有考虑过?
    • 已标记为答案 oneonce 2016年1月5日 15:47
    • 取消答案标记 oneonce 2016年1月5日 15:47
    2015年12月28日 7:58
  • 不好意思,最近几天上不了网。

    从现象上来看是运行在UI线程上。但这似乎违背了Task的本意。

    2016年1月5日 15:48
  • 您好,

    我查了下Task的源代码,可以看到用Task.Run()创建的Task,它涉及到一个异步链的问题,当你wait()的时候,它会等Task.Run()里面的异步执行完后再接着执行下面的代码。因此才会出现你说的UI阻塞的问题。

    如果你一定要用Task.Run()创建Task,你可以在Task外面在包装一个Dispatcher

    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { 
            //your task
    });


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年1月8日 9:26
    版主