如何运行多线程应用程序?

Pen*_*uen 0 .net c# winforms

这些代码会生成这个错误:

跨线程操作无效:控制'progressBar2'从其创建的线程以外的线程访问.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ThreadingTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        ThreadStart ts1;
        ThreadStart ts2;
        Thread t1;
        Thread t2;

        private void btnStart_Click(object sender, EventArgs e)
        {
            ts1 = new ThreadStart(z1);
            ts2 = new ThreadStart(z2);

            t1 = new Thread(ts1);
            t2 = new Thread(ts2);

            t1.Start(); 
            t2.Start();

            btnStart.Enabled = false;
        }

        public void z1()
        {

            for (int i = 1; i < 60; ++i)
            {
                progressBar1.Value += 1;
                for (int j = 1; j < 10000000; ++j)
                {
                    j += 1;
                }
            }
        }

        public void z2()
        {
            for (int k = 1; k < 100; ++k)
            {
                progressBar2.Value += 1;
                for (int j = 1; j < 25000000; ++j)
                {
                    j += 1;
                }
            }
        }

        private void btnstop_Click(object sender, EventArgs e)
        {
            t1.Suspend(); 
            t2.Suspend();
        }

        private void btnContinue_Click(object sender, EventArgs e)
        {
            t1.Resume(); 
            t2.Resume();

        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            if (t1.IsAlive)
            {
                MessageBox.Show("Çal??an threadler var program sonlanamaz.");
            }
            else
            {
                this.Close();
            } 

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

您无法访问除该负责该控件的UI线程之外的线程中的UI控件.

请参阅我的线程教程中的WinForms页面,并搜索BackgroundWorker.NET 2.0中引入的组件,这些组件使生活变得更加容易(特别是对于进度条).

另外,我试图避免使用Thread.Suspend/ Resume,更喜欢更合作的方法(例如用Monitor.Wait/ Pulse).这允许您避免在持有锁等时挂起线程.