/// <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;
这个方法我懂,可是不好。只是屏蔽错误。初学线程。
/// 线程。
/// </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;
这个方法我懂,可是不好。只是屏蔽错误。初学线程。
解决方案 »
- 怎么在c#手动输入对象数组?
- winform如何过滤listbox中重复的项
- fileupload的使用
- C# CS开发中求一经典的方法实现窗体控件自适应大小
- 智能设备项目:将程序生成CAB文件 并将CAB部署到PocketPC等仿真设备
- C#应用程序,怎么能实现象QQ一样,选择当前状态,系统托盘图标也随之改变,在线
- Datagrid Databinding事件 可不可以绑定显示数据
- c#线程随机读取数组中的数
- 请高手指点一下关于“代表”的问题
- 如何实现像ACDSEE,PHOTOSHOP那样拖动图象时的平滑滚动?
- COMBOBOX中选择各个项目的条件语句,帮帮修改下
- 急求:c# StatusStrip 通过什么方式显示进度?
在ThreadTask()中,下面的代码导致while循环是在UI线程执行的。
即UI线程在不停的设置progressBar,然后Sleep()。
应该是让工作线程执行一些功能后,更新progressBar,然后Sleep()。
if (this.progressBar1.InvokeRequired)
{
mythis m = new mythis(ThreadTask);
this.progressBar1.Invoke(m);
}参考下面这种方式。private void step(){ int stp, newVal;
Random random = new Random(); if (this.InvokeRequired)
{
mythis m = new mythis(ThreadTask);
this.Invoke(m);
}else{
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;
}}private void ThreadTask()
{
while (true)
{
step();
Thread.Sleep(100);
}
}
Random random = new Random(); if (this.InvokeRequired)
{
mythis m = new mythis(step);
this.Invoke(m);
}else{
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;
}}private void ThreadTask()
{
while (true)
{
step();
Thread.Sleep(100);
}
}
不好意思,说着说着,关键的地方忘改了。标红的。
int stp, newVal;
Random random = new Random(); 就是放到else里面。
if (this.InvokeRequired)
{
mythis m = new mythis(ThreadTask);
this.Invoke(m);
}else{
//...
}