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,它应该是不行的.
即使方法结束*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中的所有内容时,在线程池上执行异步...(或者至少不阻塞调用线程).
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |