2011-12-06 3 views
0

これは、私が働いている古い学校のWinFormsアプリケーションであり、彼らが使用されたパターン設計を次のようになります。winformsでトランザクションをトランザクションにするためにスレッドをロックするのがよい方法ですか?

あなたは物事がトランザクションにする必要があるときは、操作は独自のスレッド、およびスレッド上で実行されます(操作ごとに特定のロックオブジェクトが使用されます)、wcfサービスが呼び出され、ローカルオブジェクトの一部が更新され、ロックが解除されます。

これは良い方法ですか?

+0

"ローカル"オブジェクトだけがあなたが言うように更新されている場合、なぜあなたは全くロックしていますか?もっと情報が必要だと思う。コードは常に同様に役立ちます。 –

+0

デッドロックを作成したり、コードをスパゲッティにしたりしない限り、もちろんそれを行うことができます。 – Tudor

答えて

1

はい、ただし、多すぎるロックでデッドロックが発生する可能性があるため、マルチスレッドには注意してください。

0

"スレッドをロックする"という言葉がよく分かりません。それはこれのようなものですか?

static object ThreadLock = new object(); 

void ThreadProc(object state) 
{ 
    lock (ThreadLock) 
    { 
     // do stuff here 
    } 
} 

もしそうなら、そのデザインには何も間違っていません。あなたのUIスレッドは、そのコードを実行するはずのスレッドを生成し、ロックは複数のスレッドが同時に実行するのを防ぎます。ロックの背後にキューされている多くのスレッドを潜在的に持つことができるという点では少し無駄ですが、実際には1つまたは2つ以上のスレッドが待機しているとは限りません。より効率的な方法(ある種のタスクキューを実装する)がありますが、単純で効果的です。

0

複数のロックオブジェクトを待っていない限り、これは問題ありません。あなたはこのような状況がある場合、デッドロックが発生します。

スレッドをA:

lock (lockObject1) 
{ 
    // Do some stuff 

    lock (lockObject2) 
    { 
     // Do some stuff 
    } 
} 

スレッドB:

lock (lockObject2) 
{ 
    // Do some stuff 

    lock (lockObject1) 
    { 
     // Do some stuff 
    } 
} 

あなたがスレッドAでlockObject1をロックするために起こる場合は、スレッドBロックlockObject2前スレッドAがそれをロックすると、両方のスレッドは別のスレッドでロックされているオブジェクトを待機し、オブジェクトがロックされている間待機しているのでロックされません。これは単純化された例です。この状況では多くの方法があります。

デッドロックを回避するには、最初のオブジェクトがロックされている間に2番目のオブジェクトを待たないでください。このように一度に1つのオブジェクトをロックすると、デッドロックは発生しません。なぜなら、最終的にロックスレッドは待機中のスレッドに必要なオブジェクトを解放するからです。だから、例えば、上記展開されなければならない:

スレッドA:

lock (lockObject1) 
{ 
     // Do some stuff 
} 

lock (lockObject2) 
{ 
     // Do some stuff 
} 

スレッドB:この場合

lock (lockObject2) 
{ 
     // Do some stuff 
} 

lock (lockObject1) 
{ 
     // Do some stuff 
} 

、各操作が別のリソースを取得しようとせずに完了しますロック、デッドロックが回避されます。

0

これはアクションをトランザクションにしていません。私は、全体の操作が成功するか、または何も効果がないことを意味すると思います。同期ブロック内の2つのローカルオブジェクトを更新すると、2番目のエラーは最初のものへの変更をロールバックしません。

また、メインスレッドが更新中に2つのオブジェクトを使用するのを止めるものはありません。ロックすることによっても協調する必要があります。

バックグラウンドスレッドのロックは、メインスレッドでこれらのオブジェクトを使用するときにロックするだけで意味があります。

関連する問題