排队异步任务以连续运行

时间:2018-12-07 16:29:17

标签: c# asynchronous task-parallel-library

基本上我想知道这段代码是否有问题:

public async Task<int> ReadAsync(int BlockID, int StartPosition, byte[] buffer, int offset, int count)
{
    var t = new Task<int>(() => ReadBlockAsync(BlockID, StartPosition, buffer, offset, count).Result);

    IOTasks.Enqueue(t);

    RunTaskQueue();

    await t;

    return t.Result;
}

bool QueueRunning;

private async void RunTaskQueue()
{
    if (QueueRunning) { return; }

    QueueRunning = true;

    Task<int> t;

    while (IOTasks.Count > 0)
    {
    t = IOTasks.Dequeue();
    t.Start();
    await t;
    }

     QueueRunning = false;
}

我希望我的班级提供一个异步的解决方案,但是我不允许同时从文件中读取和/或写入文件。如果有人尝试异步读取,则必须按顺序进行,每个调用都等待,直到调用完成为止(FIFO)。

我需要一些时间才能完成课程(实际上我的课程可以正常运行,但只能同步进行),因此在完成之前,要测试它并不容易。该代码对我来说很有意义,但是有人可以看到它的任何问题吗?学习异步非常困难,我不想将课程基于狡猾的代码。

ReadBlockAsync方法从文件的一部分读取。

我正在使用异步void(我知道如果可以避免它,我不应该使用它),但我只想“解雇” RunTaskQueue方法,以便它可以完成所有待完成的任务完成。

这里的主要方法ReadAsync仅等待其自身的任务完成,然后返回给调用方。

如果运行ReadBlockAsync的任务在这里抛出异常还会发生什么?

0 个答案:

没有答案