public partial class Form1 : Form
{
private bool isThreadToRun;
public Form1()
{
InitializeComponent();
}
private void StartBtn_Click(object sender, EventArgs e)
{
isThreadToRun = true;
Thread newThread = new Thread(new ThreadStart(EndlessLoop));
newThread.Start();
}
private void StopBtn_Click(object sender, EventArgs e)
{
isThreadToRun = false;
}
private void EndlessLoop()
{
while (isThreadToRun)
{
Thread.Sleep(1000);
}
DoSomething();
SetTextInForm("Thread has stopped");
}
private void DoSomething()
{
MessageBox.Show("Thread has stopped");
}
delegate void SetText(string text);
private void SetTextInForm(string text)
{
//Dialog is a TextBox on the Form
if (Dialog.InvokeRequired)
Invoke(new SetText(SetTextInForm), new object[] { text });
else
Dialog.Text = text;
}
}
Jeg har lige lavet lidt kode til dig, som gerne skulle uddybe den "globale" boolean.
Da jeg nu lige var igang, viser jeg også, hvordan du kan undgå cross thead problemer, hvis du vil have tråden til at opdatere formen. En MessageBox kan kaldes uden problemer fra en tråd, men det kan formen ikke. Dette skyldes, at formen kører i en tråd, og hvis en alternativ tråd skal opdatere noget i formen, skal dette lige "aftales" med formtråden, så det kan ske, når den er parat (InvokeRequired er false).