为什么编译器无法识别我的异步方法?

时间:2015-08-03 14:42:07

标签: c# asynchronous

我不确定为什么我收到以下编译器错误。我正在使用Microsoft Visual C#2013和.NET 4.5。

  

'await'运算符只能在异步方法中使用。考虑使用'async'修饰符标记此方法,并将其返回类型更改为'Task< System.Data.DataSet>'。

当我正在读取文件并遍历读取行时,我试图启动一些CPU密集型任务以异步运行,我将在读取整个文件后等待。我正在尝试使用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++;
    }
}

这是我在等待完成任务以及我收到错误的地方。错误发生在“await 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++;
    }
}

1 个答案:

答案 0 :(得分: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();