
C# winform 多线程
根据MSDN上的示例,我想改进一下做成winform上label1和label2变化的例子但是调试的时候提示有错误,请问出了什么问题?代码如下:namespaceWind...
根据MSDN上的示例,我想改进一下做成winform上label1和label2变化的例子但是调试的时候提示有错误,请问出了什么问题?代码如下:
namespace WindowsFormsApplication1
{
public class Worker
{
// This method will be called when the thread is started.
public void DoWork(Label lb1,Label lb2)
{
lb2.Text = "start";
int i = 0;
while (!_shouldStop)
{
lb1.Text = "working"+(i++);
}
lb2.Text = "end";
}
public void RequestStop()
{
_shouldStop = true;
}
private volatile bool _shouldStop;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork(this.label1,this.label2 ));
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");
while (!workerThread.IsAlive) ;
Thread.Sleep(1);
workerObject.RequestStop();
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}
}
想实现点击按钮1控制label1和label2进行变化
错误 1 与“System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)”最匹配的重载方法具有一些无效参数
错误 2 参数“1”: 无法从“void”转换为“System.Threading.ParameterizedThreadStart” 展开
namespace WindowsFormsApplication1
{
public class Worker
{
// This method will be called when the thread is started.
public void DoWork(Label lb1,Label lb2)
{
lb2.Text = "start";
int i = 0;
while (!_shouldStop)
{
lb1.Text = "working"+(i++);
}
lb2.Text = "end";
}
public void RequestStop()
{
_shouldStop = true;
}
private volatile bool _shouldStop;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork(this.label1,this.label2 ));
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");
while (!workerThread.IsAlive) ;
Thread.Sleep(1);
workerObject.RequestStop();
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}
}
想实现点击按钮1控制label1和label2进行变化
错误 1 与“System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)”最匹配的重载方法具有一些无效参数
错误 2 参数“1”: 无法从“void”转换为“System.Threading.ParameterizedThreadStart” 展开
展开全部
线程传参
Thread workerThread = new Thread(new ParameterizedThreadStart (DoWork));
workerThread.Start(this.lab1,this.lab2);
DoWork(object lab1 ,object lab2)//必须是obj类型
{
//可以转换成Lable 类型
}
另外如果是指需要修改控件内容 可以使用委托
delegate void show(string lab1, string lab2);
void labshow(string lab1, string lab2)
{
lable1.text=lab1;
lable2.text=lab2;
}
线程运行中加入
show s=new show(labshow);
this.invoke(s,new string[] {lab1,lab2});
Thread workerThread = new Thread(new ParameterizedThreadStart (DoWork));
workerThread.Start(this.lab1,this.lab2);
DoWork(object lab1 ,object lab2)//必须是obj类型
{
//可以转换成Lable 类型
}
另外如果是指需要修改控件内容 可以使用委托
delegate void show(string lab1, string lab2);
void labshow(string lab1, string lab2)
{
lable1.text=lab1;
lable2.text=lab2;
}
线程运行中加入
show s=new show(labshow);
this.invoke(s,new string[] {lab1,lab2});
追问
修改控件内容,可以不使用委托吗?我的意思就是想让线程启动后label1和label2的内容变换,但不清楚Dowork方法的参数和线程启动中方法实例的参数应该如何写才能达到目的
追答
可以按照你原来的传参方式 lable 委托的参数也可以变成lable 也可以不使用委托 直接传参
展开全部
New Thrading()里的参数应该是一ThreadStart类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
启用线程之后可以把按钮btnGetAllData的属性Enabled属性设置为false,这样用户就不能多次点击该按钮了,在线程结束的时候再把该属性设置为true。同样的你也可以bool下,判断在线程开始前和技术后判断下bool如果该线程正在运行中return,如果没有执行该线程则启用线程
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-10-24
展开全部
把多线程用法好好看看。上面代码明显有误 。
追问
请说的详细点,这个代码是根据MSDN示例修改的,原本DoWork方法是不带参数的,进行控制台的输出,我想换成对label1和label2 Text的更改,就出现了问题,明显的话,麻烦指出一下,新学CS,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询