【发布时间】:2016-04-12 07:32:00
【问题描述】:
我最近一直在尝试学习在 WPF 中使用 Task 的过程,但遇到了一个障碍,这很可能是由于我缺乏经验。当对我的数据服务方法“GetFutureWork”执行异步调用时,UI 线程变得无响应。代码如下所示。请注意,此项目使用 MVVM,变量“WorkList”只是一个可观察的集合,用于我的 listiview 的 itemsource。
private async void LoadWork()
{
WorkList = await _dataService.GetFutureWork("UserNameHere");
}
数据服务任务
public async Task<IEnumerable<FutureWork>> GetFutureWork(string userName)
{
using (_db = new DataEntities())
{
var workList = await (from items in _db.REPAIR_CHECK_IN_TABLEs
where items.LOCATION == userName && items.COMPLETED == "N"
select new FutureWork
{
FormattedDate = items.EstShipDate.ToString(),
ServiceID = items.SERVICE_ID,
ImagePath = @"\\192.168.5.50\photos$\" + items.SERVICE_ID + "P1.bmp",
Priority = items.PRIORITY
}).ToListAsync();
return workList;
}
}
【问题讨论】:
-
LoadWork()是从 UI 线程调用的吗?是什么导致此方法被调用?DataEntities的构造函数需要多少时间?里面有什么特别的吗? -
是 LoadWork 从 UI 线程调用。它是从视图模型的构造函数中调用的。 ` public FutureWorkViewModel(IDataService dataService) { _dataService = dataService;负载工作(); }` 数据实体的构造函数需要 145 毫秒,所以我觉得这可能不是罪魁祸首。
-
你需要等待 LoadWork();还有
-
@axlj 是对的,你必须一直使用
async和await才能真正实现异步。但是,你不能将构造函数声明为async(这样你就可以在其中await)所以你最好explore some other options。 -
一般来说,在构造函数中调用
async方法不是一个好主意,因为对象将在async方法完成之前被构造。但是,这并不能解释为什么应用程序停止响应。也许DataEntities的构造函数需要很多时间?请注意new DataEntities()将在 UI 线程上运行。