我想写信给StreamWriter
行async
,但我不想等待此事。
for(int i= 0 ;i<1000;i++)
{
sw.WriteLineAsync(i.ToString());
}
但我收到的错误是我同时调用WriteLineAsync
。
StreamWriter
。如何验证我现在关闭而不写StreamWriter
上的所有数据,或者当我关闭流时,所有与WriteLineAsync
一起发送的数据将在流关闭之前写入?
答案 0 :(得分:2)
在您的特定环境中,做您想做的事情有两个主要问题。
从技术上讲,如果你调用异步方法,迟早需要await
,因此你可以收集任务,稍后会await
收集任务。但是,WriteLineAsync
方法非原子,因此调用它并对流执行其他操作可能会损坏流本身。
答案 1 :(得分:1)
如果您不想等待,请不要调用异步方法..
如果要在使用后关闭流,请使用using
。
using (StreamWriter writer = new StreamWriter("temp.txt"))
{
for (int i = 0; i < 1000; i++)
{
writer.WriteLine(i.ToString());
}
}
如果您希望它是异步的,那么您必须调用异步版本,否则会损坏该文件。
答案 2 :(得分:1)
如果要使用async编写行,则应使用await
。因为,该文件可能已损坏,您可能会遇到可能的流错误,如&#34;该流已在使用&#34; 。简而言之,您应该同步写入操作。
所以,我提供了一个例子;
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);
然后像这样打电话;
<<