为什么"await LoadAsync()"会冻结UI,而"await Task.Run(()=> Load())"却没有?

kin*_*ajj 2 .net wpf entity-framework async-await

我下面的演练如何使用的EntityFramework WPF结合.我决定玩async/await,因为我之前从未真正有机会使用它(我们刚从VS2010/.NET 4.0转移到VS2013/.NET 4.5).让保存按钮处理程序变为异步是轻而易举的,并且在等待SaveChangesAsync()时,UI仍然保持响应(我可以拖动窗口).然而,在窗口加载处理程序中,我遇到了一个小问题.

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        EnterBusyState();
        var categoryViewSource = (CollectionViewSource)FindResource("categoryViewSource");
        _context = await Task.Run(() => new Context());
        await Task.Run(() => _context.Categories.Load());
        //await _context.Categories.LoadAsync();
        categoryViewSource.Source = _context.Categories.Local;
        LeaveBusyState();
    }
Run Code Online (Sandbox Code Playgroud)

当我使用第一种加载_context.Categories的方式时,UI仍然保持响应,但是当我用下面的注释掉的行代替时,UI会在实体加载时冻结一小段时间.有没有人解释为什么前者有效而后者无效呢?这不是什么大不了的事情,只是在第二行无法工作的时候,至少根据我迄今为止研究过的async/await,它应该是不行的.

Ric*_*ter 6

即使方法结束*Async或返回任务并不意味着它完全是异步或异步...

例:

public Task FooAsync()
{
    Thread.Sleep(10000); // This blocks the calling thread
    return Task.FromResult(true);
}
Run Code Online (Sandbox Code Playgroud)

用法(看起来像异步调用):

await FooAsync();
Run Code Online (Sandbox Code Playgroud)

即使返回任务,示例方法也完全同步...您需要检查实现LoadAsync并确保没有任何阻塞.

当使用Task.Runlambda中的所有内容时,在线程池上执行异步...(或者至少不阻塞调用线程).