2012-04-26 21 views
2

をファイルに情報を保存し同期させるために:プロセスの間に私の問題がある最適な方法は、私が機能以下の持っている私のコードでは

void SaveData() 
{ 
    new Thread(
     ()=> 
     { 
      lock(data) 
      { 
       Serialize(data); 
      } 
     }).Start(); 
} 

、その:SaveDataをのようなものに見える

void OnEvent(....){ SaveData();} 

イベントは複数回発生する可能性があり、最初のシリアル化プロセスが終了した後に1回だけシリアル化を実行したいと考えています。

これを行うにはどのような方法が最適ですか?

+0

"初期シリアル化プロセスが終了した後に、シリアル化が1回だけ実行されるようにします。" 最初のシリアル化(別名2回のみ)または正確に1回(すべてのコールが完了した後)に1回だけ追加することを意味しますか? –

+0

条件変数を調べましたか?私はマルチスレッドの専門家ではありませんが、これはあなたが探しているものかもしれません。 – covertCoder

答えて

3

あなたが対処する必要がある多くの問題があります。

まず、Threadクラスを使用しないでください。本当に。並列処理のためのフレームワークを作成していない限り、Threadを使用している場合は、間違いがあります。 System.Threading.Tasks.Taskまたは(バージョン4.0以前の.NETの場合)System.Threading.ThreadPoolなどを使用して、コードの非同期実行をスケジュールします。

第2に、スレッド間でdataのようなインスタンス変数を共有することは固執することに注意してください。 を保存するデータをに渡す方が競合や競合の問題がないように非同期機能を使用する方がはるかに優れています。あなたは、これは実行の順序である場合に発生します何をすべきか

第三に、:

<things happen> 
OnEvent fires 
<things happen> 
Serialize starts 
OnEventFires 
Serialize completes 

Serializeの真ん中にOnEvent火災は、それはそれを完全に無視するべきか、それが別のシリアル化をスケジュールする必要がありますので、?ここで "b"と答えると、ここで何が起こるはずですか?

<things happen> 
OnEvent fires 
<things happen> 
Serialize starts 
OnEvent fires 
<things happen> 
OnEvent fires 
Serialize completes 

Serializeから呼び出しは、スケジュール、またはただ一つべきか?

+0

1つで十分です。イベントはユーザーがデータを変更することです。明らかに、シリアライゼーション中に数回起動された場合、データは1回だけ保存されます。 –

+0

@ArsenZahray:シリアル化が2番目のイベントの前に*開始されたとしても(表面的には変更前のデータを保存していることを意味します変更が発生した後に保存したくない場合は、 –

関連する問題