2017-12-25 27 views
-3

StreamWriterasyncに書きたいと思いますが、私はこれを待たずにいます。c#streamWriter WriteLineAsyncを待たずに

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

しかし、私はWriteLineAsyncに同時に呼び出すというエラーが発生しました。

  1. これを修正するにはどうすればよいですか?
  2. このループの後にこれを閉じたいとします。StreamWriter

どのように私は私が今StreamWriter上のすべてのデータを書き込むために近くのない、または私はストリームを閉じるときWriteLineAsyncで送信されたすべてのデータは、ストリームのクローズ前に書き込みをされることを確認することができますか?

+4

非同期メソッドを使用する場合は、それらを待つ必要があります。ストリームを正しく書き込んだり閉じたりする唯一の方法です。それ以外の場合は、WriteLineを使用して非同期を避けてください。 – Nkosi

+0

@NkosiなぜWriteLineAsyncが必要な場合は、awitを使用する必要がありますか?私は結果を待たずに、WriteLineを使いたくない。なぜなら、行が書き込まれるまで待たずにいるからだ。 – sdassf

+2

'WriteLineAync'を' await'なしで呼び出すとファイルが壊れる。あなたは非同期/待機の目的を理解していないようです。これは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のようです。あなたが達成しようとしている究極の目標は何ですか? – Nkosi

答えて

1

あなたは待つしたくない場合は、非同期メソッドを呼び出すことはありません。..

あなたが使用した後、ストリームを閉じたい場合は、それをusingを使用しています。

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

あなたはそれが非同期になりたい場合は、それ以外の場合は、破損したファイル意志、非同期バージョンを呼び出す必要があります。

+0

なぜWriteLineAsyncが必要なのですか?私は結果を待たずにWriteLineを使いたくないです。なぜなら、その行が書き込まれるまで待たずに – sdassf

+0

WriteLineを通常使うか、WriteLineAsyncを待つかのどちらかです。そうしないと、ファイルが破損します。 – rokkerboci

+0

私はあなたが欲しいものを理解していません。あなたが書き込みオペレーションが完了するのを待つことを望まないなら、なぜそれを待っていないのですか?それはなぜ存在するのですか。 – rokkerboci

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()); 
       } 
      } 
     } 
    } 

また、あなたはStreamWriterusing内のブロックを閉じて処分することができます。

EDIT

あなたはメインスレッドとは別に、書き込み動作を実行する場合は、非同期メソッドを使用して、ちょうど別々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); 
+0

なぜWriteLineAsyncが必要なのですか?私はawitを使用する必要がありますか?私は結果を待たずに、WriteLineを使用したくない。なぜなら、行が書き込まれるまで待たずにいるからだ。 – sdassf

+0

メインスレッドは待っているとブロックされていない。スレッドは呼び出し元メソッドからの実行を続けます。これが唯一正しい方法です。 – lucky

+0

私はスレッドを呼び出し元に戻って知っていますが、私は自分のスレッドがすぐにwriteLineを完了するのを待つのではなく、すぐ次のループを続行してほしい – sdassf

2

具体的な状況では、実行したいことには2つの主な問題があります。 技術的に言えば、非同期メソッドを呼び出すと、遅かれ早かれawaitが必要なので、後でそのタスクを収集することができます。awaitただし、WriteLineAsyncメソッドはではないであるため、ストリームを呼び出すと、ストリーム上で他の操作を実行するとストリーム自体が壊れる可能性があります。

関連する問題