これは基本的な質問のようですが、Googleは私を助けてくれませんでした... C#.NET WPFで基本的なスレッドロックを行うにはどうすればよいですか?私の非常に単純なユーザーアプリケーションでは、結果を1つの共通データ構造に保存したり、この共通データ構造から読み取ったりする、時間のかかる操作を実行する複数のスレッドがあります。スレッドセーフを維持するために、このデータ構造へのアクセスをロック()およびロック解除()できるようにしたいと思います。ただし、コードには、1つだけでなく、このデータ構造にアクセスするさまざまな場所があります。このロックを実装するために使用される.NETオブジェクトは何ですか?
4 に答える
同期を実現するには複数の方法があります。私が作成したスクリーンショットをご覧ください
これを試して:
public static class LockHolder
{
public static object Lock = new object();
}
次に、コードで次を使用します。
lock(LockHolder.Lock)
{
//your safe code
}
http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx
もう少し情報が役立つかもしれないと思います。IIRCは、基本的にコンパイラによって展開され、安全なコードlock(object o)
へのアクセスを制限するマクロです。これは、期待どおりのことです。必ずしも明らかではないのは、どのオブジェクトもロックになる可能性があり、それぞれが安全なロックごとに必要であるということです。私が持っている場合o
o
object a = new object();
object b = new object();
そして、周りにあるものへのアクセスを妨げないlock(a)
thenを実行します。ほとんどのコードサンプルは、特定のクラスの現在のインスタンスにロックするを示しています。これは、グローバルロックが必要で、そのクラスの複数のインスタンスが実行されている場合は必要ありません。lock(b)
lock(this)
System.Collections.Concurrent名前空間にあるようなスレッドセーフなデータ構造を使用する方が簡単な場合があります。彼らはあなたのためにすべての仕事をします。
SachaBarberによるCodeProjectに関するこの素晴らしい記事を確認してください。
http://www.codeproject.com/Articles/27366/Beginner-s-Guide-to-Threading-in-NET-Part-3-of-n
いくつかの同期メカニズムについて説明します。
乾杯