首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

对线程很不理解。Control.Invoke解决思路

2012-02-17 
对线程很不理解。Control.InvokeC# code/// summary/// 线程。/// /summaryprivate Thread myThreadpub

对线程很不理解。Control.Invoke

C# code
        /// <summary>        /// 线程。        /// </summary>        private Thread myThread;        public Form1()        {            InitializeComponent();          //  Control.CheckForIllegalCrossThreadCalls = false;        }        private void button1_Click(object sender, EventArgs e)        {            MessageBox.Show("这是主线程");        }        private void ThreadTask()        {            int stp, newVal;            Random random = new Random();            if (this.progressBar1.InvokeRequired)            {                mythis m = new mythis(ThreadTask);                this.progressBar1.Invoke(m);            }            while (true)            {                stp = this.progressBar1.Step * random.Next(-1, 2);                newVal = this.progressBar1.Value + stp;                if (newVal > this.progressBar1.Maximum)                    newVal = this.progressBar1.Maximum;                else if (newVal < this.progressBar1.Minimum)                    newVal = this.progressBar1.Minimum;                this.progressBar1.Value = newVal;                Thread.Sleep(100);            }        }        delegate void mythis();        private void Form1_Load(object sender, EventArgs e)        {            myThread = new Thread(new ThreadStart(this.ThreadTask));            myThread.IsBackground = true;            myThread.Start();        }


出来的效果是main线程无限等待,然后进度条在不断跳动。就是除了button1无法按下,其他都达到效果了。请问怎么解决?
// Control.CheckForIllegalCrossThreadCalls = false;
这个方法我懂,可是不好。只是屏蔽错误。初学线程。

[解决办法]
另外说点,下面的代码最好是在判断this.InvokeRequired之后。
 int stp, newVal; 
 Random random = new Random(); 

就是放到else里面。
if (this.InvokeRequired)
{
mythis m = new mythis(ThreadTask);
this.Invoke(m);
}else{
//...
}

热点排行