如何使用C#从UI终止线程

时间:2012-09-23 22:10:24

标签: c#

我已启动一个线程,我希望用户能够通过单击表单上的按钮来中断它。我找到了以下代码,它很好地展示了我想要的东西。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

namespace ExThread {

public partial class MainForm : Form {
    public int clock_seconds=0;

    [STAThread]
    public static void Main(string[] args) {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }

    public MainForm() {
        InitializeComponent();

        Thread thread_clock = new Thread(new ThreadStart(Thread_Clock));
        thread_clock.IsBackground = true;
        thread_clock.Start();
    }

    delegate void StringParameterDelegate (string value);

    public void Update_Label_Seconds(string value) {
        if (InvokeRequired) {
            BeginInvoke(new StringParameterDelegate(Update_Label_Seconds), new object[]{value});
            return;
        }
        label_seconds.Text= value + " seconds";
    }       

    void Thread_Clock() {
        while(true) {
            clock_seconds +=1;
            Update_Label_Seconds(clock_seconds.ToString());
            Thread.Sleep(1000);
        }
    }

    private void btnStop_Click(object sender, EventArgs e)
    {

    }
}
}

我添加了btnStop方法。需要添加什么代码来停止thread_clock线程。

感谢。

1 个答案:

答案 0 :(得分:8)

首先,线程需要能够识别它应该结束。变化

void Thread_Clock() {
    while(true) {

bool endRequested = false;
void Thread_Clock() {
    while(!endRequested) {

然后在按钮点击处理程序中将endRequested设置为True。

private void btnStop_Click(object sender, EventArgs e)
{
    endRequested = true;
}

请注意,对于这种特定情况,使用Timer

可能更合适

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

只需根据需要启动和停止计时器。您可以从计时器的Tick()事件更新时钟。