0

以下に示すように、Parallel.Forループがあります。ファイルが存在しない状態でプログラムを実行すると、「別のプロセスで使用されているため、プロセスはファイル'C:\ ShowTime Error Logs\logFile.txt'にアクセスできません」などのエラーが発生します。

ただし、ファイルが存在する場合はエラーはありません。私は混乱しています。ファイルが存在しなくても、私のコードはすでにファイルを作成しています。プログラムを実行する前にファイルが存在しない場合にエラーが発生するのはなぜですか。そして、どうすればそれを修正できますか?

どうも

ErrorLog el = new ErrorLog();
        Parallel.For(0, 100000, delegate(int i)
    {
        el.WriteToShowTimeLog("logFile", "", "", (i).ToString(), "", "", @"C:\");
    });

ErrorLogクラスには関数と静的変数があります

private static readonly object lock_ = new object();
    public  void WriteToShowTimeLog(string fileName, string errorMessage, string description, string movieID, string theaterID, string showTimeDate, string folderPath)
    {
        string filePath = folderPath + @"\ShowTime Error Logs\" + fileName + ".txt";
        lock (lock_)
        {

            if (!Directory.Exists(folderPath + @"\ShowTime Error Logs"))
            {
                Directory.CreateDirectory(folderPath + @"\ShowTime Error Logs");
            }

            if (!File.Exists(filePath))
            {
                File.Create(filePath);
            }

            using (StreamWriter dosya = new StreamWriter(filePath,true))
            {

                dosya.WriteLine("TheaterID:        " + theaterID);
                dosya.WriteLine("MovieID:          " + movieID);
                dosya.WriteLine("Show Time Date:   " + showTimeDate);
                dosya.WriteLine("Hata Mesajı:      " + errorMessage);
                dosya.WriteLine("Açıklama:         " + description);
                dosya.WriteLine("Hata Alınan Zaman:" + DateTime.Now);
                dosya.WriteLine("-------------------------------------------------------------------------------------------------------");
                dosya.Close();


            }
        }
    }
4

2 に答える 2

2

ファイルのチェックと作成をロックに含める必要があります。そうしないと、2つの別々のスレッドから同時にファイルを作成して、表示されるエラーを生成する可能性があります。

編集

File.Create開いているファイルを返します。次に、StreamWriterはそれを再度開こうとします。おそらく、StreamWriterを作成してから、StreamWriter用に再作成するのではなく、使用するStreamwriterのオプションを簡単に設定する必要があります。

于 2012-04-07T16:51:26.970 に答える
1

ロックの外にあるものはすべて、任意のスレッドで任意の順序で実行できます。反対の仮定をしないでください。この場合、ファイルが存在するかどうかをスレッド #1 に確認させることができます。そうでないため、if 句に入り、スレッド #2 が引き継ぎます。スレッド #2 は、ファイルが存在するかどうかを確認します。そうでないため、スレッド #2 も if 句に入り、ファイルを作成します。スレッド #1 が再び引き継がれると、驚きです! ファイルが存在しないことを「ちょうど」チェックしたとしても、ファイルはすでに作成されています。

ほとんどの出力ストリームは、データが読み込まれるファイルを自動的に作成するため、そのセクションが必要でさえない場合があります。

于 2012-04-07T16:55:01.450 に答える