2017-11-05 4 views
-1

ロックオブジェクトを1つ使用しようとしていますが、ロックの下の2つの異なる場所でStreamWriterを使用して、 :プロセスはこのファイルにアクセスできません。これは、Cの別のプロセスで使用されているためです。

プロセスは、別のプロセスで使用されているため、ファイル 'filename'にアクセスできません。定義された

ロックオブジェクト、私は、静的オブジェクトを使用:右この後

protected static Object Semaphore = new Object(); 

if(x != null) 
{ 
    lock (Semaphore) 
    { 
     using (StreamWriter sw = new StreamWriter(fileName)) 
     { 

      sw.WriteLine(a + "," + b + "," + c); 
      sw.Close(); 
      sw.Flush(); 
     } 
    } 

} 

を:

if(y != null) 
{ 
    lock (Semaphore) 
    { 
     using (StreamWriter sw1 = new StreamWriter(fileName)) 
     { 

      sw1.WriteLine(a + "," + b + "," + c); 
      sw1.Close(); 
      sw1.Flush(); 
     } 
    } 
} 

を私は何をしないのですか?ありがとうございました。

+0

あなたはそれが重要な部分であるので、あなたがこのコードを使用する方法を示す必要があります。 – CodingYoshi

+0

このコードを閉じる必要はありません。を使用してストリームライターを破棄し、それをフラッシュして閉じます –

+1

実際にこの問題を見るには、[mcve]を提供する必要があります。今すぐあなたのコードは素晴らしいように私たちが答えることができるものは何もありません。 – Enigmativity

答えて

0

ファイルはオペレーティングシステムによって「使用中」としてマークされています。エラーメッセージはセマフォメカニズムからのものではありません。通常は、セマフォと組み合わせて使用​​すると、ファイルが正常に閉じられるはずです。

2つのコード部分のうち、例外を投げるものはどれですか?あなたは他の場所でそれを開きますか?

Btw。 &をコピーしてください/あなたのコードを修正してください - あなたの貼り付けられたデモコードは実行されません - 閉じられたテキストライターはフラッシュできません!

MYテストケース - まだスレッドません:

internal class Program 
{ 
    public static void DoStuff() 
    { 
     Directory.CreateDirectory(Path.GetDirectoryName(fileName)); 

     if (x != null) 
     { 
      lock (lockObj) 
      { 
       WriteStuff(); 
      } 
     } 

     if (y != null) 
     { 
      lock (lockObj) 
      { 
       WriteStuff(); 
      } 
     } 
    } 


    private static string fileName = "C:\\temp\\tempfile.txt"; 
    private static object lockObj = new object(); 
    private static string x = ""; 
    private static string y = ""; 

    static void Main(string[] args) 
    { 
     DoStuff(); 
    } 

    static void WriteStuff() 
    { 
     using (StreamWriter sw1 = new StreamWriter(fileName)) 
     { 
      sw1.WriteLine("irrelevant"); 
     } 
    } 
} 
関連する問題