最近看了下多线程的委托传值。写代码时遇到一些问题。从网上找的文章代码打出来和我的问题一样。
下面是代码,麻烦朋友们帮忙看看。using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsApplication2
{
//声明一个回调函数:注意传递的参数要与Example类中的函数参数类型一致
public delegate void ExampleCallback(int lineCount, Label lb);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void CurrentNumber(int tempCurrent, Label lb)
{
try
{
lb.Text = tempCurrent.ToString();
}
catch (Exception ex)
{
}
}
private void button1_Click(object sender, EventArgs e)
{
ThreadWithData twd = new ThreadWithData(1, 100, this.label1, new ExampleCallback(CurrentNumber));
Thread td = new Thread(new ThreadStart(twd.RunMethod));
td.Start();
} private void button2_Click(object sender, EventArgs e)
{
ThreadWithData twd = new ThreadWithData(2, 200, this.label2, new ExampleCallback(CurrentNumber));
Thread td = new Thread(new ThreadStart(twd.RunMethod));
td.Start();
}
}
public class ThreadWithData
{
private int start = 0;
private int end = 0;
private ExampleCallback callBack;
private Label lb; public ThreadWithData(int start, int end, Label lb, ExampleCallback callBack)
{
this.start = start;
this.end = end;
this.callBack = callBack;
this.lb = lb;
}
public void RunMethod()
{
for (int i = start; i < end; i++)
{
Thread.Sleep(1000);
//if (callBack != null)
callBack(i, lb);
} }
}
}
下面是代码,麻烦朋友们帮忙看看。using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsApplication2
{
//声明一个回调函数:注意传递的参数要与Example类中的函数参数类型一致
public delegate void ExampleCallback(int lineCount, Label lb);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void CurrentNumber(int tempCurrent, Label lb)
{
try
{
lb.Text = tempCurrent.ToString();
}
catch (Exception ex)
{
}
}
private void button1_Click(object sender, EventArgs e)
{
ThreadWithData twd = new ThreadWithData(1, 100, this.label1, new ExampleCallback(CurrentNumber));
Thread td = new Thread(new ThreadStart(twd.RunMethod));
td.Start();
} private void button2_Click(object sender, EventArgs e)
{
ThreadWithData twd = new ThreadWithData(2, 200, this.label2, new ExampleCallback(CurrentNumber));
Thread td = new Thread(new ThreadStart(twd.RunMethod));
td.Start();
}
}
public class ThreadWithData
{
private int start = 0;
private int end = 0;
private ExampleCallback callBack;
private Label lb; public ThreadWithData(int start, int end, Label lb, ExampleCallback callBack)
{
this.start = start;
this.end = end;
this.callBack = callBack;
this.lb = lb;
}
public void RunMethod()
{
for (int i = start; i < end; i++)
{
Thread.Sleep(1000);
//if (callBack != null)
callBack(i, lb);
} }
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsApplication2
{
//声明一个回调函数:注意传递的参数要与Example类中的函数参数类型一致
public delegate void ExampleCallback(int lineCount, Label lb);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void CurrentNumber(int tempCurrent, Label lb)
{
//try
//{
lb.Text = tempCurrent.ToString();
//}
//catch (Exception ex)
//{
//}
}
private void button1_Click(object sender, EventArgs e)
{
ThreadWithData twd = new ThreadWithData(1, 100, this.label1, new ExampleCallback(CurrentNumber));
Thread td = new Thread(new ThreadStart(twd.RunMethod));
td.Start();
} private void button2_Click(object sender, EventArgs e)
{
ThreadWithData twd = new ThreadWithData(2, 200, this.label2, new ExampleCallback(CurrentNumber));
Thread td = new Thread(new ThreadStart(twd.RunMethod));
td.Start();
}
}
public class ThreadWithData
{
private int start = 0;
private int end = 0;
private ExampleCallback callBack;
private Label lb; public ThreadWithData(int start, int end, Label lb, ExampleCallback callBack)
{
this.start = start;
this.end = end;
this.callBack = callBack;
this.lb = lb;
}
public void RunMethod()
{
for (int i = start; i < end; i++)
{
Thread.Sleep(1000);
//if (callBack != null)
callBack(i, lb);
} }
}
}
{
if (lb.InvokeRequired)
{
lb.Text = tempCurrent.ToString();
}
else
{
lb.Invoke(new ExampleCallback(CurrentNumber), tempCurrent, lb);
}
}
{
if (!lb.InvokeRequired)
{
lb.Text = tempCurrent.ToString();
}
else
{
lb.Invoke(new ExampleCallback(CurrentNumber), tempCurrent, lb);
}
}
不好意思 逻辑写错了. 下面这个才是对的
还没有试过,不过从今天最后看的一点资料看,else里的东西应该就是问题的关键了。
这么说,是不是可以这么理解,我其实直接就可以使用Invoke而不用再进行判断?
还是说这里有什么其它的说法?