c#streamWriter WriteLineAsync没有等待

时间:2017-12-25 20:43:36

标签: c# asynchronous stream async-await

我想写信给StreamWriterasync,但我不想等待此事。

for(int i= 0 ;i<1000;i++)
{
  sw.WriteLineAsync(i.ToString());
}

但我收到的错误是我同时调用WriteLineAsync

  1. 我该怎么做才能解决这个问题?
  2. 我希望在此循环后关闭此StreamWriter
  3. 如何验证我现在关闭而不写StreamWriter上的所有数据,或者当我关闭流时,所有与WriteLineAsync一起发送的数据将在流关闭之前写入?

3 个答案:

答案 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);

然后像这样打电话;

<<