我正在尝试实现.NET 4.5 async / await,并遇到了一些问题。
我有这段代码:
private async void GetPages()
{
PageList = await _dataService.GetPageList(JobTypeId);
}
IDataService看起来像这样
public interface IDataService
{
Task<List<PageDto>> GetPageList(int jobTypeId);
}
和DataService.GetPageList像这样:
public Task<List<PageDto>> GetPageList(int jobTypeId)
{
var retval = new List<PageDto>();
try
{
retval =
(from p in _connection.Table<PageDto>()
where p.JobTypeId == jobTypeId
select p).ToList();
}
catch (Exception ex)
{
Logger.Exception(ex);
}
return retval;
}
我不知何故需要将结果包装在一个任务中,但我无法弄清楚如何。
有什么想法吗?
更新
由于我正在使用的SQLLite库的限制,我不能使用ToListAsync,但这样的事情怎么样?
public async Task<List<PageDto>> GetPageListAsync(int jobTypeId)
{
var retval = new List<PageDto>();
try
{
await Task.Run(() =>
{
retval =
(from jtp in _connection.Table<JobTypePage>()
join p in _connection.Table<PageDto>() on jtp.PageId equals p.PageId
where jtp.JobTypeId == jobTypeId
orderby jtp.JobTypePageId
select p).ToList();
});
}
catch (Exception ex)
{
Logger.Exception(ex);
}
return retval;
}
答案 0 :(得分:5)
首先,你应该从内到外使用异步方法(而不是从外向内“强加”异步)。在这种情况下,我假设你正在使用EF6,所以你可以这样做:
retval = await
(from p in _connection.Table<PageDto>()
where p.JobTypeId == jobTypeId
select p).ToListAsync();
然后你可以标记你的方法async
:
public async Task<List<PageDto>> GetPageListAsync(int jobTypeId)
我注意到,我添加了Async
后缀以跟随Task-based Asynchronous Pattern。
有关详细信息,请查看我的async
intro。