2012-01-07 7 views
0

プロセスが3つあり、特定のファイルに順番に書き込み、プロセスがファイルを書き込もうとしているときに(書き込みの途中で)、別のファイル2つのプロセスに問題がある場合は、プロセスの順序を制御するサーバープロセスを追加し、プロセスが終了するとイベントが発生するため、プロセスが終了したときにこのイベントでどのようにソース(ファイルアクセス)を解放できますか。 File.Release(FilePath);ファイルへのアクセスを解放する

編集のようなもの:

書き込みには、以下のようにファイルへ:

try { 
     if(!File.Exists(FilePath)) 
      throw new Exception("File does not Exist."); 

     bool Clear = false; 
     using(StreamReader sr = new StreamReader(FilePath)) { 
      if(sr.ReadToEnd().Length > 1200) 
       Clear = true; 
      } 

     if(Clear) 
      using(StreamWriter sw = new StreamWriter(FilePath, false)) { 
       sw.WriteLine(Text); 
       sw.Flush(); 
     } else 
      using(StreamWriter sw = new StreamWriter(FilePath, true)) { 
       sw.WriteLine(Text); 
       sw.Flush(); 
     } 
} catch(Exception ex) {} 
+1

ファイルに書き込むコードを表示します。基本的には、ファイルに書き込むときに、書き込みアクセス権でそのファイルのハンドルを開きます。誰もそのファイルに書き込むことはできません。しかし、書き込みが終わったら、ハンドルを解放する必要があります(通常はDisposeまたはCloseを呼び出すか、コードを 'using'ブロックに入れます)。 – oleksii

+0

@oleksii I Update itの質問を参照してください。 – Saeid

+0

Oleksiiによると、キーワード "using"を使用します。これは暗黙のうちに、ハンドルが維持され、作業が完了したときにそれを廃棄するIdisposableを意味します。それがベストプラクティスです。データベース接続と同じ方法で使用されます。 – King

答えて

5
using System.IO; 

class Program 
{ 
    static void Main() 
    { 
      using (StreamWriter writer = new StreamWriter("important.txt")) 
      { 
       writer.Write("Word "); 
       writer.WriteLine("word 2"); 
       writer.WriteLine("Line"); 
      } 
    } 
} 

これは、 "使用" の使用、キーワードを言ったときに、我々は意味の例のタイプです。ストリームライターを明示的に閉じたり、明示的に処理したりしないでください。あなたのためにすべての魔法を使用してください。仕事が終わったとき、そしてあなたがこの使用ブロックから出るとき、それは処分されます。

closeまたはdisposeを明示的に使用すると、マルチスレッド環境では、以前のスレッドがオブジェクトをただ破棄した間に、スレッドがオブジェクトを開こうとする可能性があることを考慮してスレッドに問題が発生します。スレッドの同期に問題が発生します。これは、データベースに複数の接続を実行しているサーバーアプリケーションで通常発生するのと同じ問題です。それが私たちがIdisposableでこのように使う必要がある理由です。

C# USING keyword - when and when not to use it?

これはそれについての詳細を説明しています。

更新:複数のクライアントが同時に1つのファイルに書き込むことが問題です。上記のように、書き込みモードでは、同じファイルを2つのプロセスで同時に保持することはできません。大量のデータを書き込む場合は待機する必要があります。この待機時間は著しく目立ちます。また、クライアントからオブジェクトを収集し、キューに入れ、実際にサーバーから書き込むこともできます。サーバー上のファイルに対する書き込みアクセスをクライアントに与えることも回避できます。データがシリアル化されている場合は、Googleプロトコルバッファを使用してデータを渡すことができます。

クライアントからファイルを処理していて、クライアントプロセスが途中で終了した場合、ファイルへの書き込みハンドルはなくなります。他のプロセスが自由にハンドルを取得できることは明らかです書き込みアクセス。

関連する問題