2015-02-23 3 views
0

Пожалуйста, взгляните на следующие два метода. Первая функция GetQuoteImageContent вызывает GetFileHeadersByDirectory, чтобы вернуть список объектов FileVM. Однако, если я вернуть первую функцию с:Использование ConfigureAwait

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

то он работает нормально, но потому, что мне нужно сделать некоторую обработку возвращаемого значения так, когда я пытаюсь присвоить его переменной:

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

он выпадает из функции, не возвращая ничего. Может кто-нибудь указать на ошибку в моем механизме вызова? В конце концов, я хочу заполучить сборник IEnumerable < FileVM>, чтобы обработать его. Любая помощь в этом отношении очень ценится.

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; 
    } 
} 
+0

* он выпадает из функции, не возвращая ничего. * Что это значит? Если вы имеете в виду, что метод возвращает управление выполнением вызова вызывающему методу, то это то, что он должен делать. –

+0

Элемент управления возвращается в точку, откуда я вызываю GetQuoteImageContent –

+0

Так работает 'await'. Он вернется обратно к 'GetQuoteImageContent', как только он завершит выполнение асинхронного метода (продолжит его продолжение). –

ответ

2

Из комментариев, я понимаю, что вы не ожидали на GetQuoteImageContent, и именно поэтому вы, кажется, думаете, что ваш метод не возвращает изображения.

Если вы хотите перебрать изображения сразу после ГЭТ, вы должны будете await на это тоже:

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

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

Если вы не await, компилятор будет кричать на вас за то, чтобы перебирать то, что не является итерационным (поскольку Task не реализует IEnumerable).

+1

Да, я понял, что все методы в цепочке не использовали «ожидание», и поэтому асинхронный вызов терпел неудачу. Спасибо за вашу помощь и внимание. –

Смежные вопросы