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”
展开
 我来答
hongfei357
2013-10-24 · TA获得超过285个赞
知道小有建树答主
回答量:384
采纳率:100%
帮助的人:234万
展开全部
线程传参

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 也可以不使用委托 直接传参
清水栞
2013-10-24 · TA获得超过1547个赞
知道小有建树答主
回答量:1538
采纳率:50%
帮助的人:1064万
展开全部
New Thrading()里的参数应该是一ThreadStart类型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者gJI7UqisQR
2019-09-25 · TA获得超过4219个赞
知道大有可为答主
回答量:3232
采纳率:31%
帮助的人:204万
展开全部
启用线程之后可以把按钮btnGetAllData的属性Enabled属性设置为false,这样用户就不能多次点击该按钮了,在线程结束的时候再把该属性设置为true。同样的你也可以bool下,判断在线程开始前和技术后判断下bool如果该线程正在运行中return,如果没有执行该线程则启用线程
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-10-24
展开全部
把多线程用法好好看看。上面代码明显有误 。
追问
请说的详细点,这个代码是根据MSDN示例修改的,原本DoWork方法是不带参数的,进行控制台的输出,我想换成对label1和label2 Text的更改,就出现了问题,明显的话,麻烦指出一下,新学CS,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式