|
分類:[C#]
環境はWindows11、VisualStudio2022です。
C#は初心者です。
長時間かかるプログラムで、中断してSaveできないと話にならないということで、マルチスレッド化したのですが、
サブスレッドからUIを変更すると、当然エラーになります。最終的には、サブスレッドから、delegate/Invokeで
メインスレッドからUI操作すれば良いことが分かり、やりたいことはすべてできました。(100%理解してませんが)
ただ、その過程で試したものが、上手く動いていると言えば言えるのですが、正しくないような気もしてもやもやが残りましたので、
質問させていただきます。
public partial class Form1 : Form
{
Boolean wStopF;
public Form1()
{
InitializeComponent();
}
private async void btnStart_Click(object sender, EventArgs e)
{
wStopF = false;
MessageBox.Show("Main "+Thread.CurrentThread.ManagedThreadId);
await SubProc();
MessageBox.Show("Completed");
}
private void btnStop_Click(object sender, EventArgs e)
{
wStopF = true;
}
private async Task SubProc()
{
MessageBox.Show("Sub " + Thread.CurrentThread.ManagedThreadId);
int wN = 0;
while (true)
{
if (wStopF) break;
int wDummy = 0;
for (int I = 0; I < 100000000; I++)
{
wDummy++;
}
wN++;
label1.Text = "SubProc" + wN;
Application.DoEvents();
}
MessageBox.Show("Stop");
}
}
どこから、await SubProc();なんて引っ張り出したのか、今となっては良くわからないのですが、多分
https://qiita.com/toRisouP/items/a2c1bb1b0c4f73366bc6
辺りかと思います。
これだと、UIはちゃんと変更されますし、Stopボタンも機能します。ただし、DoEventsがないとStopボタンは押せない状態になります。
質問は、
1.このプログラムだとすべてメインスレッドで動いているのに、なぜStopボタンが押せるのか?
2.このプログラムの状態は、Stopボタンは生きているが、疑似的なマルチスレッドで、実質的にシングルスレッドで動いている
と言う理解で良いのか?
よろしくお願い申し上げます。
|