Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么编译器不能识别我的异步方法?_C#_Asynchronous - Fatal编程技术网

C# 为什么编译器不能识别我的异步方法?

C# 为什么编译器不能识别我的异步方法?,c#,asynchronous,C#,Asynchronous,我不确定为什么会出现以下编译器错误。我正在使用Microsoft Visual C#2013和.NET 4.5 “await”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”。 当我读取一个文件并遍历读取行时,我试图启动一些CPU密集型任务以异步运行,在读取整个文件之后,我将等待这些任务。我试图使用在“节流”标题下提供的示例 这是我的异步方法 protected async Task<ImagePropertyUpdater> proces

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

“await”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”。

当我读取一个文件并遍历读取行时,我试图启动一些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;
}
受保护的异步任务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();