Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中对异步文件IO进行排队?_C#_Asynchronous_Io - Fatal编程技术网

如何在C#中对异步文件IO进行排队?

如何在C#中对异步文件IO进行排队?,c#,asynchronous,io,C#,Asynchronous,Io,我有一个异步写入日志文件的函数,它被多次调用。但是,我得到了一个错误: System.IO.IOException: 'The process cannot access the file '<log path>' because it is being used by another process.' 我对异步编程的理解主要来自node.js,它是一种单线程语言。我认为C#是多线程的(并且对异步代码采用多线程方法),IO不会像node.js中那样自动排队等待资源,这对吗 有没有

我有一个异步写入日志文件的函数,它被多次调用。但是,我得到了一个错误:

System.IO.IOException: 'The process cannot access the file '<log path>' because it is being used by another process.'
我对异步编程的理解主要来自node.js,它是一种单线程语言。我认为C#是多线程的(并且对异步代码采用多线程方法),IO不会像node.js中那样自动排队等待资源,这对吗


有没有一种简单的方法可以在C#中异步写入文件?还是让这个日志函数同步比较好,因为性能成本与几行写入无关…

Async Void很糟糕,您将无法正确捕获异常,而且通过使用同步方法运行任务,您没有获得异步的全部好处,您仍然会阻塞资源

使用a可能更好,但如果确实需要,可以这样编写异步:

private async Task WriteTextAsync(string filePath, string text)
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text);

    using (FileStream sourceStream = new FileStream(filePath,
        FileMode.Append, FileAccess.Write, FileShare.None,
        bufferSize: 4096, useAsync: true))
    {
        await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    };
}

我的思维过程就是开火,然后忘记记录线。但我想他们应该在密码里等待。在这种情况下可以避免冲突为什么不使用支持异步的日志框架谢谢-我知道我应该使用日志框架。。。。您的附加到文件的实现与我的有什么区别?@ZachSmith查看我的编辑,最好使用一个框架来避免不可预见的问题谢谢。你加锁了吗?还是签名中的
异步任务
?如果您等待所有异步代码,您仍然可以获得竞争条件吗?i、 e.如果异步运行的两个单独的函数调用同一路径的
WriteTextAsync
,会导致竞争吗?@Nkosi认为
FileShare不合适。无
选项,这与运行期间的文件不一样吗write@johnny5锁定是这样的,文件写入将按照调用顺序进行。
private async Task WriteTextAsync(string filePath, string text)
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text);

    using (FileStream sourceStream = new FileStream(filePath,
        FileMode.Append, FileAccess.Write, FileShare.None,
        bufferSize: 4096, useAsync: true))
    {
        await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    };
}