如何从异步任务返回对象列表

时间:2014-11-11 22:02:39

标签: .net async-await

我正在尝试实现.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;
}

1 个答案:

答案 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