问题模型大概是这样的:
有两个任务,第一个要耗大量的时间(5秒左右),第二个任务只是绑定数据(不怎么耗时间),当前状况是,两个任务在一个线程里面,导致白屏了5秒左右,我想将第一个任务用另一个线程工作,控制界面的button的enable属性,一开始false,任务完成后变成true,不知道要注意些什么,
试了好多方法,效果都不怎么好,都有缺点,比较赞同的是使用多线程.
哪位有时间的帮忙看看,先谢过!
ajax,做任务时友好提示OK?
给你贴上个例子的代码吧,你自己看看,呵呵,使用backgroundWorker控件来创建新线程
private void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
this.textBox3.Text = string.Empty;
this.button2.Enabled = true;
this.progressBar1.Value = 0;
backgroundWorker1.RunWorkerAsync(new CalcInput(int.Parse(this.textBox1.Text), int.Parse(this.textBox2.Text)));
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
CalcInput input = (CalcInput)e.Argument;
//System.Threading.Thread.Sleep(5000);
//e.Result = input.x + input.y;
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(500);
backgroundWorker1.ReportProgress(i * 10);
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
}
e.Result = input.x + input.y;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//this.textBox3.Text = e.Result.ToString();
//this.button2.Enabled = true;
//this.button1.Enabled = false;
//this.progressBar1.Value = 100;
if (e.Cancelled)
{
this.textBox3.Text = "cancelled";
}
else
{
this.textBox3.Text = e.Result.ToString();
}
this.button2.Enabled = true;
this.button1.Enabled = false;
this.progressBar1.Value = 100;
}
private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
}
public struct CalcInput
{
public CalcInput(int x, int Y)
{
this.x = x;
this.y = Y;
}
public int x;
public int y;
}
如果没看懂,呵呵,可以来问我,呵呵
看了问题.有点建议
"有两个任务,第一个要耗大量的时间(5秒左右),第二个任务只是绑定数据(不怎么耗时间),当前状况是,两个任务在一个线程里面,导致白屏了5秒左右,我想将第一个任务用另一个线程工作,控制界面的button的enable属性,一开始false,任务完成后变成true"
既然是任务完成才变为true.明显是一个单线的任务模式!为了解决白屏5秒问题开多线程- -!感觉方向不对
本人建议应该优化那个耗时5秒的任务,且控件改为双缓冲模式