使用ConfigureAwait

时间:2015-02-23 14:41:12

标签: c# .net async-await

请看下面两种方法。第一个函数 GetQuoteImageContent 调用 GetFileHeadersByDirectory 来返回FileVM对象列表。但是,如果我返回第一个函数:

return await fileTasks.GetFileHeadersByDirectory(imageLibraryDirectory, false,
                                                 "/quotecontents/").ConfigureAwait(false);

然后它运行正常,但因为我需要对返回值进行一些处理,所以当我尝试将它分配给变量时:

IEnumerable<FileVM> images = await fileTasks.GetFileHeadersByDirectory(
                                             imageLibraryDirectory, false,
                                             "/quotecontents/").ConfigureAwait(false);

它没有返回任何东西而退出了该功能。 请问有人能指出我的通话机制中的错误吗?最后,我想要掌握集合 IEnumerable&lt; FileVM&gt; 对它进行一些处理。在这方面的任何帮助非常感谢。

public async Task<IEnumerable<FileVM>> GetQuoteImageContent(string quoteId)
{
    IFileTasks fileTasks = new FileTasks();
    string imageLibraryDirectory = string.Format("quotecontents/{0}", quoteId.Split('/')[1]);
    IEnumerable<FileVM> images = await fileTasks.GetFileHeadersByDirectory(imageLibraryDirectory, false, "/quotecontents/").ConfigureAwait(false);

     return images;           
}

// This is 2nd async method which queries database to return list of files
public async Task<IEnumerable<FileVM>> GetFileHeadersByDirectory(string directory, bool recursive, string rootDirectory = "")
{
    using (var fileSession = TasksManager.CreateTemporaryFSSession())
    {
        var fileQuery = fileSession.Query().OnDirectory(directory, recursive);

        var fileHeaders = await fileQuery.ToListAsync().ConfigureAwait(false);

        var fileVMs = ConvertToFileVM(fileHeaders, rootDirectory);

        return fileVMs;
    }
}

1 个答案:

答案 0 :(得分:2)

根据评论,我了解到您并未等待GetQuoteImageContent,这就是为什么您似乎认为您的方法不会返回图片。

如果您希望在获得图片后立即迭代图片,那么您也必须await

IEnumerable<FileVM> images = await GetQuoteImageContent(quoteId).ConfigureAwait(false);

foreach (var image in images)
{
    // Do something
}

如果你没有await,编译器会因为试图迭代不可迭代的东西而大喊你(因为Task没有实现IEnumerable