在exclusivesscheduler上调度WriteAsync的StreamWriter抛出InvalidOpera

本文关键字:StreamWriter 抛出 InvalidOpera WriteAsync exclusivesscheduler 调度 | 更新日期: 2023-09-27 18:01:27

我在一个exclusivesscheduler上快速连续地安排一系列写到StreamWriter的操作,如下所示:

return Task.Factory.StartNew(async () => 
        {
            await _writer.WriteAsync(responseJson.ToString() + ',');
            await _writer.FlushAsync();
        }, 
        _cancel.Token, 
        TaskCreationOptions.None, 
        _writeNetworkScheduler.ExclusiveScheduler);

如果我安排写得足够快,我得到一个InvalidOperationException。经过一番深入研究后,看起来编写器挂起了为抛出此异常而执行的最后一个异步操作。这是我在这个Writer上安排写操作的唯一方法。

如果我改变使用方法的非异步版本,事情执行得很好,但我想了解为什么我得到这个异常,当我已经在等待以前的写和刷新

在exclusivesscheduler上调度WriteAsync的StreamWriter抛出InvalidOpera

是的,这是因为StartNew不理解async的方法。您需要展开它们,如下所示:

return Task.Factory.StartNew(async () => 
    {
        await _writer.WriteAsync(responseJson.ToString() + ',');
        await _writer.FlushAsync();
    }, 
    _cancel.Token, 
    TaskCreationOptions.DenyChildAttach, 
    _writeNetworkScheduler.ExclusiveScheduler).Unwrap();

(另外,对于打算由await使用的任务,使用DenyChildAttach选项)。