在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上安排写操作的唯一方法。
如果我改变使用方法的非异步版本,事情执行得很好,但我想了解为什么我得到这个异常,当我已经在等待以前的写和刷新
是的,这是因为StartNew
不理解async
的方法。您需要展开它们,如下所示:
return Task.Factory.StartNew(async () =>
{
await _writer.WriteAsync(responseJson.ToString() + ',');
await _writer.FlushAsync();
},
_cancel.Token,
TaskCreationOptions.DenyChildAttach,
_writeNetworkScheduler.ExclusiveScheduler).Unwrap();
(另外,对于打算由await
使用的任务,使用DenyChildAttach
选项)。