私は2つのスレッドが同時にクラスからメソッドを実行するアプリケーションに取り組んでいます。このメソッドは複雑な計算を実行し、結果はWinFormに表示されます。C#はどのようにスレッドの切り替えを処理しますか?
だから私のクラスには、次のようになります。
class Comp_func
{
/* Constructor */
public Comp_func()
{
}
public void THE_Complex_func(string One, Int16 Two, Int32 Three)
{
Calculate_this(One);
Thread.Sleep(10);
Calculate_that(Two);
Thread.Sleep(10);
Calculate_thatThat(Three);
Thread.Sleep(10);
Update_lable_in_form(value);
Thread.Sleep(10);
}
}
各スレッドがそうのWinFormに異なるLabel
を更新し、私は(私はスレッドセーフメソッドを使用していたとして)スレッドの同期については問題を期待していません。
私の必要性は、それらの更新が同時に発生する必要があります(少なくとも同時に発生するようです)。
私の形で、「計算」ボタンをユーザーがクリックすると、私が行うと:Comp_func Func1_class = new Comp_func();
Comp_func Func2_class = new Comp_func();
Thread Func1_Thread = new Thread(() => Func1_class.Start_Test("Blah", 2,3));
Thread Func2_Thread = new Thread(() => Func2_class.Start_Test("BlahBlah", 4,5));
//Func1_Thread.Priority = ThreadPriority.Highest; /* Deleted after Comments */
// Func2_Thread.Priority = ThreadPriority.Highest; /* Deleted after Comments */
Func1_Thread.Start();
Func2_Thread.Start();
/*
// Removed after Comments
// Let only Threads Run
while(true)
{
Application.DoEvent();
Update();
}
for(count = 0; count < 100; count++)
{
console.WriteLine("I WON'T USE WHILE(1) loops with DOEVENTS");
}
*/
私の問題は、スレッド1が完了の実行は、それがLabel
を更新したときに、その後2つの開始を通し、ということです実行します。
この現象を回避するため、ほぼ各行の後にThread.Sleep();
と書きました。あたかもウィンドウが切り替わっていないかのように振る舞います!
これはなぜ起こっているのですか?
ありがとうございました!
あなたは何が起こることを期待していますか?通常、悪い習慣とみなされるいくつかの事柄についてのサイドノート。スレッド優先度、無限ループを明示的に示します。なぜあなたはThread.Sleep行が必要ですか? – kaj
問題はスレッドが正しく切り替わらないことです。実行はスレッド1が完了してからスレッド2のようになります。だから私は、Thread.Sleepがスレッドを強制的に切り替えると考えました。 – Swanand
スレッドが切り替わらないことをどのように知っていますか?あなたの関数呼び出しでは、各スレッドが一度だけ作業を完了したときに一度だけUIを更新します。あなたがスレッド1を持っているコードでは、スレッド2の前に常に完了します。 – dice