为什么编译器不能识别我的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++;
    }
}

为什么编译器不能识别我的async方法

谢谢@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();