繁体   English   中英

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

[英]Why does the compiler not recognize my async method?

我不确定为什么会出现以下编译器错误。 我正在将Microsoft Visual C#2013与.NET 4.5一起使用。

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

当我读取文件并遍历读取行时,我试图启动一些CPU密集型任务以异步运行,在读取整个文件后,我将等待。 我正在尝试使用消耗基于任务的异步模式的“限制”标题下提供的示例

这是我的异步方法。

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++;
    }
}

这是我等待任务完成的地方,也是我得到错误的地方。 错误发生在“等待任务.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++;
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM