c#streamWriter WriteLineAsync没有等待

问题描述 投票:-3回答:3

我想写信给StreamWriter line async,但我不想等待。

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

但我得到了一个错误,我同时调用WriteLineAsync

  1. 我该怎么做才能解决这个问题?
  2. 我想在这个循环之后关闭这个StreamWriter

如何验证我现在关闭而不在StreamWriter上写入所有数据,或者当我关闭流时,使用WriteLineAsync发送的所有数据都将在流关闭之前写入?

c# asynchronous stream async-await
3个回答
2
投票

在您的特定环境中,做您想做的事情有两个主要问题。从技术上讲,如果你调用异步方法,你需要迟早使用await,因此你可以收集任务,并在以后收集await。但是,WriteLineAsync方法不是原子的,因此调用它并在流上执行其他操作可能会破坏流本身。


1
投票

如果你不想等待,那么不要调用异步方法..

如果要在使用后关闭流,请使用using

using (StreamWriter writer = new StreamWriter("temp.txt"))
{
    for (int i = 0; i < 1000; i++)
    {
        writer.WriteLine(i.ToString());
    }
}

如果您希望它是异步的,那么您必须调用异步版本,否则它将损坏该文件。


1
投票

如果要使用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);
© www.soinside.com 2019 - 2024. All rights reserved.