2015-11-15 58 views
0
using System.Numerics; 
using System.Threading.Tasks; 

namespace Fibonacci_cs 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int i; 
      var ausgabe = Task.Factory.StartNew((() => {})); 
      BigInteger x, y = 1, z = 1; 
      for (i = 1; i < int.MaxValue; i++) 
      { 
       x = y; 
       Task.WaitAll(); 
       y = z; 
       Task.Factory.StartNew((() => { z = BigInteger.Add(x, y); })); 
       Task.Factory.StartNew((() => 
       { 
        if (ausgabe.IsCompleted) 
        { 
         ausgabe = Task.Factory.StartNew((() => 
         { 
          using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"A:\Fibonacci.txt")) 
          { 
           file.WriteLine("i: " + i); 
           file.WriteLine("z: " + z); 
          } 
         })); 
        } 
       })); 
      } 

      Task.WaitAll(); 
      using (System.IO.StreamWriter file = 
       new System.IO.StreamWriter(@"A:\Fibonacci.txt")) 
      { 
       file.WriteLine("i: " + i); 
       file.WriteLine("z: " + z); 
      } 
     } 
    } 
} 

我得到一個System.IO.IOException,因爲該文件是「正在使用」。我錯過了什麼?該過程在使用後是否不關閉文件?IOException在使用線程時

我沒有更多的細節,除了我必須這樣使用它。

+1

聽起來就像你試圖從不同的線程同時寫入同一個文件。 – CodesInChaos

+0

該文件通過嘗試寫入該文件的多個線程(執行您創建的任務)進行訪問。你爲什麼這樣做? –

+0

文件寫入操作不是線程安全的,您應該以另一種方式進行操作。 – Larry

回答

0

文件訪問操作全部同時發生。我建議你在你的循環之外創建StreamWriter,並在你有你的使用塊的流對象上使用lock

例如

var streamWriter = new System.IO.StreamWriter(@"A:\Fibonacci.txt"); 
//for loop 
    lock (streamWriter) 
    { 
     streamWriter.WriteLine("i: " + i); 
     streamWriter.WriteLine("z: " + z); 
    } 
相關問題