为什么编译器不能识别我的async方法
本文关键字:async 方法 我的 识别 编译器 不能 为什么 | 更新日期: 2023-09-27 18:06:10
我不确定为什么我得到以下编译器错误。我使用的是Microsoft Visual c# 2013和。net 4.5。
'await'操作符只能在异步方法中使用。考虑使用'async'修饰符标记此方法,并将其返回类型更改为'Task
'。
当我读取文件并遍历读取行时,我试图启动一些CPU密集型任务以异步运行,我将在读取整个文件后等待。我试图在消费基于任务的异步模式
中使用"Throttling"标题下提供的示例。这是我的异步方法。
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++;
}
}
这是我等待任务完成的地方,也是我得到错误的地方。错误发生在"await task . whenany (ImagePropertiesTasks)"answers"await task"上。
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++;
}
}
谢谢@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();