如何确定线程是否使用c#完成?

  发布于 2023-02-13 17:12

我正在使用C#中的线程.以下是我正在使用的代码

// worker thread
Thread m_WorkerThread;

// events used to stop worker thread
ManualResetEvent m_EventStopThread;
ManualResetEvent m_EventThreadStopped;


private void btnSend_Click(object sender, EventArgs e)
{
    if (btnSend.Text == "Cancel")
    {
        StopThread();
        btnSend.Text = "Send";
        return;
    }
    else
    {
        // initialize events
        m_EventStopThread = new ManualResetEvent(false);
        m_EventThreadStopped = new ManualResetEvent(false);

        btnSend.Text = "Cancel";
        // reset events
        m_EventStopThread.Reset();
        m_EventThreadStopped.Reset();

        // create worker thread instance
        m_WorkerThread = new Thread(new ThreadStart(this.ThreadFunction));

        m_WorkerThread.Name = "Thread Sample";  // looks nice in Output window

        m_WorkerThread.Start();
    }
}
private void StopThread()
{
    if (m_WorkerThread != null && m_WorkerThread.IsAlive)  // thread is active
    {
        // set event "Stop"
        m_EventStopThread.Set();
        // wait when thread  will stop or finish
        try
        {
            Thread.Sleep(1000);
            m_WorkerThread.Abort();
            m_WorkerThread.Suspend();
        }
        catch { }

    }
    ThreadFinished();       // set initial state of buttons
    return;
}
private void ThreadFunction()
{
    // Doing My Work
}
private void ThreadFinished()
{
    btnSend.Text = "Send";
}

上面的代码工作正常,但我有一些问题.

    当线程结束时,btnSend.Text = "Send"不设置.

    当我按下取消时,线程没有正确结束.

    当我按下取消并关闭我的应用程序时,应用程序将继续在后台运行.

我该如何解决这些问题?

1 个回答
  • 这是如何使用BackgroundWorker取消的示例:

    public partial class Form1 : Form
    {
        bool _isWorking = false;
    
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            if (_isWorking)
            {
                // Cancel the worker
                backgroundWorker1.CancelAsync();
    
                button1.Enabled = false;
                return;
            }
            _isWorking = true;
            button1.Text = "Cancel";
            backgroundWorker1.RunWorkerAsync();
        }
    
        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (var i = 0; i < 10; i++)
            {
                if (backgroundWorker1.CancellationPending) { return; }
                Thread.Sleep(1000);
            }
            e.Result = "SomeResult";
        }
    
        void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            _isWorking = false;
            button1.Enabled = true;
            button1.Text = "Run";
            if (e.Cancelled) return;
    
            // Some type checking
            string theResult = e.Result as string;
            if (theResult == null) return; // Or throw an error or whatever u want
    
            MessageBox.Show(theResult);
        }
    }
    

    2023-02-13 17:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有