基本上我想知道这段代码是否有问题:
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的任务在这里抛出异常还会发生什么?