在ExclusiveScheduler上调度的WriteAsync上从StreamWriter抛出的InvalidOperationException

时间:2014-05-04 00:17:15

标签: c# task-parallel-library async-await

我在ExclusiveScheduler上快速连续安排对StreamWriter的一系列写操作,如下所示:

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

如果我足够快地安排写入,我会收到InvalidOperationException。在进行一些挖掘后,看起来编写器会挂起执行的最后一次异步操作以抛出此异常。这是我在这个Writer上调度写入的唯一方法。

如果我改为使用方法的非异步版本,那么事情就会很好,但是我想知道为什么当我已经在等待上一次写入时我得到了这个例外并且冲洗。

1 个答案:

答案 0 :(得分:3)

是的,这是因为StartNew无法理解async方法。你need to unwrap them就是这样:

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

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