2017-10-26 16 views
2

私は4つのウィンドウフォームを持ち、1つの別のフォームを使用します。このメソッドはフォームのいずれかで処理する必要があります。スレッドがこのメソッドを使用したい場合、メソッドが他のスレッドによってこの時点で呼び出されていないことを確認する必要があります。異なるスレッドからメソッドを呼び出す

私はその

bool methodIsBusy = false; 

void Method() 
{ 
    methodIsBusy = true; 

    //do method things 

    //done method things 

    methodIsBusy = false; 

} 

とメソッドがスレッドかによって占有されていることを知ることがmethodIsBusyを使用するようなソリューションを持っています。この問題に対する創造的な解決策はありますか?ありがとう。

+5

フォームのメソッドをUIスレッド以外のスレッドから呼び出す場合は、何か間違っていることがほぼ確実です。これはうまく終わらないでしょう。あなたがしていることを再考してください。 – xxbbcc

+0

なぜですか?私は、主なフォームから4つのフォームを作成しています。メインフォームのメソッドを新しいフォームで使用できないのはなぜですか?何が問題を引き起こす可能性がありますか? –

+5

@MehmetErkol問題は、別のフォームのメソッドを呼び出すのではなく、非UIスレッド*から呼び出すことです。あなたはUIスレッド*からこのようなメソッド*を呼び出すべきであり、その時点ですべての呼び出しがUIスレッド内にあるので、それらは同時に実行されていないことを既に知っています。 – Servy

答えて

4

最も簡単な伝統的なパターンはlockを使用して、より多くのこのようなものです。ロック内のコード(critical sectionと呼ばれる)は、一度に1つのスレッドでしか実行できません。

//Don't do this! 
while (methodIsBusy) 
{ 
    System.Threading.Thread.Sleep(10); //or some number 
} 

この種のコードは、ロックより多くのリソースを使用して終了します、である:あなたは理論的にboolを使用することができますが、このように、busywaitコードを書く必要があるだろう

object lockObject = new object(); //Can be anything, an object will do 

void Method() 
{ 
    lock (lockObject) 
    { 

     //do method things 

     //done method things 

    }  
} 

正確にこの目的のために設計されています。 W/O somthをやってロックアウトして行くではない、あなたが入力することができるかどうかをテストすることができます -

+0

ロックの例では、1.スレッドが実行されていて、tread2の実行準備が整っている場合、何が起こっていますか? 2番目のスレッドが1を待っていますか? –

+0

2番目のスレッドです。コードは 'lock {'ブロックの先頭で最初のスレッドが同じブロックを終了するまで停止します。 –

0

lockを使用すると、lockステートメントでカプセル化されたクリティカルブロックに1つのスレッドだけが確実に入ることができます。

-1

Monitor.TryEnterを見てみましょう。 try {} finalley { Monitor.Exit(obj); }を使用してロックobjを再度解放するようにしてください。

関連する問題