Я не уверен, почему я получаю следующую ошибку компилятора. Я использую 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++;
}
}
Вы забыли ключевое слово 'async' в заголовке функции функции, в которой вы получаете ошибку? – Nitram
Фрагмент кода, в который вы отправили сообщение об ошибке, не включает часть метода, которая могла бы вызвать эту ошибку. Пожалуйста, опубликуйте весь метод. –
@JeffGillispie: снова прочитайте сообщение об ошибке. Метод *, содержащий * 'await', должен быть помечен как' async' (а не метод, который вы * вызываете *). –