C# 为什么编译器不能识别我的异步方法?
我不确定为什么会出现以下编译器错误。我正在使用Microsoft Visual C#2013和.NET 4.5 “await”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”。 当我读取一个文件并遍历读取行时,我试图启动一些CPU密集型任务以异步运行,在读取整个文件之后,我将等待这些任务。我试图使用在“节流”标题下提供的示例 这是我的异步方法C# 为什么编译器不能识别我的异步方法?,c#,asynchronous,C#,Asynchronous,我不确定为什么会出现以下编译器错误。我正在使用Microsoft Visual C#2013和.NET 4.5 “await”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”。 当我读取一个文件并遍历读取行时,我试图启动一些CPU密集型任务以异步运行,在读取整个文件之后,我将等待这些任务。我试图使用在“节流”标题下提供的示例 这是我的异步方法 protected async Task<ImagePropertyUpdater> proces
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;
}
受保护的异步任务processImageAsync(ImagePropertyQueueArgs-arg)
{
ImagePropertyUpdater=等待任务。运行(()=>
{
ImageProperties props=新的ImageProperties(arg.File、arg.Record.Offset、arg.ImageValidationOptions);
返回新的ImagePropertyUpdater(参数,道具);
});
返回更新程序;
}
这是从文本文件中读取每一行后调用的方法,用于将任务排队并启动它们
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++;
}
}
受保护的队列ImagePropertiesQueue=new Queue();
受保护列表ImagePropertiesTasks=新列表();
受保护的int-ActiveTasks=0;
受保护的无效队列ImagePropertiesTask(
FileInfo文件、ImageBaseRecord记录、列表值列表、bool addPageCount、,
ImageValidationOptions ImageValidationOptions、字符串解析线、整数行号、,
字符串imageKey,数据集数据)
{
ImagePropertiesQueue.Enqueue(
新ImagePropertyQueueArgs(
文件、记录、addPageCount、imageValidationOptions、,
解析行、行号、图像键、数据);
如果(活动任务0)
{
ImagePropertyQueueArgs args=ImagePropertiesQueue.Dequeue();
任务任务=processImageAsync(args);
ImagePropertiesTasks.Add(任务);
ActiveTasks++;
}
}
这是我等待任务完成的地方,也是我得到错误的地方。错误出现在“wait Task.whenay(ImagePropertiesTasks)”和“wait Task”上
while(ImagePropertiesTasks.Count>0)
{
任务任务=等待任务。WhenAny(ImagePropertiesTasks);
ImagePropertiesTasks.Remove(任务);
ImagePropertyUpdater=等待任务;
updater.UpdateImageRecord();
如果(ImagePropertiesQueue.Count>0)
{
ImagePropertyQueueArgs args=ImagePropertiesQueue.Dequeue();
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++;
}
}
}
谢谢@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++;
}
}
}
您是否忘记了获取错误的函数的函数头中的
async
关键字?引发您发布的错误的代码段不包括可能导致该错误的方法部分。请发布整个方法。@JeffGillispie:请重新阅读错误消息。包含await
的方法必须标记为async
(而不是您正在调用的方法)。您是否忘记了获取错误的函数的函数头中的async
关键字?引发您发布的错误的代码段不包括可能导致该错误的方法部分。请发布整个方法。@JeffGillispie:请重新阅读错误消息。包含await
的方法必须标记为async
(而不是您正在调用的方法)。
Task task = new Task(waitForTasks);
task.Start();
task.Wait();