如何在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);
};
}