私があなたの質問を正しく理解した場合、ボタンクリック手順が「while」ループ内で実行されている間、TextBoxのテキストを更新し続ける必要があります。テキストボックスがどこから更新されるかを実際に指定していませんが、「while」ループ内のコードからのものであると想定します。
「akatakritos」が述べているように、ボタンクリック内のwhileループが、アプリケーションが停止している理由です。これは、whileループがユーザーインターフェイス(UI)スレッドをブロックしているために発生します。
「while」ループ内でコードを移動して別のスレッド内で実行し、ボタンをクリックしてこの新しいスレッドを開始する必要があります。
これを行う方法は次のとおりですが、最善ではないかもしれませんが、必要なことは実行されます。
新しいクラスを作成します。
public class ClassWithYourCode
{
public TextBox TextBoxToUpdate { get; set; }
Action<string> updateTextBoxDelegate;
public ClassWithYourCode()
{ }
public void methodToExecute()
{
bool IsDone = false;
while (!IsDone)
{
// write your code here. When you need to update the
// textbox, call the function:
// updateTextBox("message you want to send");
// Below you can find some example code:
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
updateTextBox(string.Format("Iteration number: {0}", i));
}
// Don't forget to set "IsDone" to "true" so you can exit the while loop!
IsDone = true;
}
updateTextBox("End of method execution!");
}
private void updateTextBox(string MessageToShow)
{
if (TextBoxToUpdate.InvokeRequired)
{
updateTextBoxDelegate = msgToShow => updateTextBox(msgToShow);
TextBoxToUpdate.Invoke(updateTextBoxDelegate, MessageToShow);
}
else
{
TextBoxToUpdate.Text += string.Format("{0}{1}", MessageToShow, Environment.NewLine);
}
}
}
また、button1_Clickメソッド内に、次のコードを追加できます。
private void button1_Click(object sender, EventArgs e)
{
ClassWithYourCode myCode = new ClassWithYourCode();
myCode.TextBoxToUpdate = textBox1;
Thread thread = new Thread(myCode.methodToExecute);
thread.Start();
}
これで、「while」ループが新しいスレッド内で実行されます。テキストボックスを更新する必要がある場合は、UIスレッド以外のスレッドからWindowsフォームコントロールを更新できないため、UIスレッドから更新します。