2015-08-03 2 views
0

Я не уверен, почему я получаю следующую ошибку компилятора. Я использую Microsoft Visual C# 2013 с .NET 4.5.Почему компилятор не распознает мой метод async?

Оператор «ожидание» может использоваться только в асинхронном методе. Подумайте о маркировке этого метода с помощью модификатора «async» и измените его тип возврата на «Задача < System.Data.DataSet>».

Как я читаю в файле и итерации по считываемым строкам, я пытаюсь запустить некоторые интенсивные задачи процессора для асинхронного запуска, которые я буду ждать после чтения во всем файле. Я пытаюсь использовать пример, приведенный под заголовком «Дросселирование», по адресу Consuming the Task-based Asynchronous Pattern

Это мой метод асинхронности.

protected async Task<ImagePropertyUpdater> processImageAsync(ImagePropertyQueueArgs arg) 
{ 
    ImagePropertyUpdater updater = await Task.Run(() => 
    { 
     ImageProperties props = new ImageProperties(arg.File, arg.Record.Offset, arg.ImageValidationOptions); 
     return new ImagePropertyUpdater(arg, props); 
    }); 

    return updater; 
} 

Это метод, который вызывается после чтения в каждой строке из текстового файла, чтобы поставить задачи в очередь и инициировать их.

protected Queue<ImagePropertyQueueArgs> ImagePropertiesQueue = new Queue<ImagePropertyQueueArgs>(); 
protected List<Task<ImagePropertyUpdater>> ImagePropertiesTasks = new List<Task<ImagePropertyUpdater>>(); 
protected int ActiveTasks = 0; 

protected void QueueImagePropertiesTask(
    FileInfo file, ImageBaseRecord record, List<object> valuesList, bool addPageCount, 
    ImageValidationOptions imageValidationOptions, String parsedLine, int lineNumber, 
    String imageKey, DataSet data) 
{ 
    ImagePropertiesQueue.Enqueue(
     new ImagePropertyQueueArgs(
      file, record, addPageCount, imageValidationOptions, 
      parsedLine, lineNumber, imageKey, data)); 

    if (ActiveTasks <= 10 && ImagePropertiesQueue.Count > 0) 
    { 
     ImagePropertyQueueArgs args = ImagePropertiesQueue.Dequeue(); 
     Task<ImagePropertyUpdater> task = processImageAsync(args); 
     ImagePropertiesTasks.Add(task); 
     ActiveTasks++; 
    } 
} 

Это то место, где я жду выполнения задач и где я получаю сообщение об ошибке. Ошибка включена в «Ожидание Task.WhenAny (ImagePropertiesTasks)» и «Ожидание задачи».

while (ImagePropertiesTasks.Count > 0) 
{      
    Task<ImagePropertyUpdater> task = await Task.WhenAny(ImagePropertiesTasks);      
    ImagePropertiesTasks.Remove(task); 
    ImagePropertyUpdater updater = await task; 
    updater.UpdateImageRecord(); 

    if (ImagePropertiesQueue.Count > 0) 
    { 
     ImagePropertyQueueArgs args = ImagePropertiesQueue.Dequeue(); 
     ImagePropertiesTasks.Add(processImageAsync(args)); 
     ActiveTasks++; 
    } 
} 
+5

Вы забыли ключевое слово 'async' в заголовке функции функции, в которой вы получаете ошибку? – Nitram

+2

Фрагмент кода, в который вы отправили сообщение об ошибке, не включает часть метода, которая могла бы вызвать эту ошибку. Пожалуйста, опубликуйте весь метод. –

+0

@JeffGillispie: снова прочитайте сообщение об ошибке. Метод *, содержащий * 'await', должен быть помечен как' async' (а не метод, который вы * вызываете *). –

ответ

0

Спасибо @Nitram, ключевое слово async было частью того, что я пропустил. Я закончил тем, что перемещал цикл while, который использовал, чтобы дождаться завершения задачи до своего собственного метода.

private async void waitForTasks() 
{ 
    while (ImagePropertiesTasks.Count > 0) 
    { 
     Task<ImagePropertyUpdater> task = await Task.WhenAny(ImagePropertiesTasks); 
     ImagePropertiesTasks.Remove(task); 
     ImagePropertyUpdater updater = await task; 
     updater.UpdateImageRecord(); 

     if (ImagePropertiesQueue.Count > 0) 
     { 
      ImagePropertyQueueArgs args = ImagePropertiesQueue.Dequeue(); 
      ImagePropertiesTasks.Add(processImageAsync(args)); 
      ActiveTasks++; 
     } 
    } 
} 

Затем я также добавил часть ниже туда, откуда я изначально ожидал завершения задач.

Task task = new Task(waitForTasks); 
task.Start(); 
task.Wait(); 
Смежные вопросы