我想写信给StreamWriter
line async
,但我不想等待。
for(int i= 0 ;i<1000;i++)
{
sw.WriteLineAsync(i.ToString());
}
但我得到了一个错误,我同时调用WriteLineAsync
。
StreamWriter
。如何验证我现在关闭而不在StreamWriter
上写入所有数据,或者当我关闭流时,使用WriteLineAsync
发送的所有数据都将在流关闭之前写入?
在您的特定环境中,做您想做的事情有两个主要问题。从技术上讲,如果你调用异步方法,你需要迟早使用await
,因此你可以收集任务,并在以后收集await
。但是,WriteLineAsync
方法不是原子的,因此调用它并在流上执行其他操作可能会破坏流本身。
如果你不想等待,那么不要调用异步方法..
如果要在使用后关闭流,请使用using
。
using (StreamWriter writer = new StreamWriter("temp.txt"))
{
for (int i = 0; i < 1000; i++)
{
writer.WriteLine(i.ToString());
}
}
如果您希望它是异步的,那么您必须调用异步版本,否则它将损坏该文件。
如果要使用async编写行,则应使用await
。因为,该文件可能已损坏,您可能会遇到可能的流错误,如“流已在使用中”。简而言之,您应该同步写入操作。所以,我提供了一个例子;
private async Task WriteToFileAsAsync()
{
string file = @"sample.txt";
using (FileStream stream = new FileStream(file, FileMode.Create, FileAccess.ReadWrite))
{
using (StreamWriter streamWriter = new StreamWriter(stream))
{
for (int i = 0; i < 1000; i++)
{
await streamWriter.WriteLineAsync(i.ToString());
}
}
}
}
此外,您可以关闭并处理StreamWriter
块内的using
。
编辑
如果要与主线程分开执行写入操作,请不要使用异步方法,只需创建一个单独的Task
并为其分配另一个线程。
private void WriteToFile()
{
string file = @"sample.txt";
using (FileStream stream = new FileStream(file, FileMode.Create, FileAccess.ReadWrite))
{
using (StreamWriter streamWriter = new StreamWriter(stream))
{
for (int i = 0; i < 1000; i++)
{
streamWriter.WriteLine(i.ToString());
}
}
}
}
然后像这样打电话;
Task.Factory.StartNew(WriteToFile);