私はC#でマルチスレッドプログラミングに触れていません。私の問題は、次の行に進む前に別のスレッドで実行されているメソッドが完了するのを待つ方法がわからないことです。たとえば、このメソッドが別のスレッドで終了するのを待つ方法は?
public class A
{
int i;
public A()
{
i = 0;
}
protected void RunLoop()
{
while(i < 100)
{
i++;
}
}
public void Start()
{
TimerResolution.TimeBeginPeriod(1);
runThread = new Thread(new ThreadStart(RunLoop));
running = true;
runThread.Start();
}
}
public class B
{
A classAInstance = new A();
A.Start();
Console.Writeline(i);
}
のようなものは今のところ、それは(すなわち、I = 100)私が欲しいものではありませんこれは、コンソール上で0を出力します。 これを行う最善の方法は何ですか?ところで、私はclass A
おかげで作成されrunThread
にアクセスすることはできません。
EDIT:
それはたくさんのコードを変更せずに、この問題を解決するために少し難しかったです。したがって、我々は別のスレッドでRunLoop
を実行するかどうかを決定できる条件を、public void Start()
に追加することになりました。条件はEnum
フィールドを使用して定義されました。
public void Start()
{
TimerResolution.TimeBeginPeriod(1);
running = true;
if (runningMode == RunningMode.Asynchronous)
{
runThread = new Thread(new ThreadStart(RunLoop));
runThread.Start();
}
else
{
RunLoop();
}
}
そして
public enum RunningMode { Asynchronous, Synchronous };
助けてくれてありがとうみんなを。
あなたが他のコードにアクセス全くない場合、あなたはおそらく他のスレッドで何が起こっているかを検出することはできません。スレッドインスタンスへのアクセス権があれば、 'Thread.Join'を使って終了するのを待つことができますが、もしそれがなくても問題は解決できません。同期には協力が必要です。 –
ちなみに、私たちは 'A.i'へのアクセス権がないので、あなたのコードをコンパイルすることはできません(もしそうであれば、スレッドセーフではありません)。だから、あなたのスレッドは状態を共有しているのですか、そうではありませんか?あなたの*実際の問題は何ですか?なぜ、明示的なスレッディングが必要だと思いますか? –
*スレッドを使用する代わりに、タスクが終了したら何らかのアクションをとるためにTasksと 'await'、' ContinueWith'、 'Wait()'などを使います。あなたが記述したシナリオを簡素化するために作成されたものです(最低でも) –