读书人

Invoke参数计数不婚配求大神指导!

发布时间: 2013-10-31 12:03:52 作者: rapoo

Invoke参数计数不匹配,求大神指导!!!

public delegate void WeiTuo<XmlNode>(XmlNode s ); //定义委托
private WeiTuo<XmlNode> weituo; //定义委托
……
 private void frmMain_Load(object sender, EventArgs e){
EQ2008Config.GetSection();
string strpath = AppDomain.CurrentDomain.BaseDirectory + "\\StationConfig.xml";
XmlDocument doc = new XmlDocument();//初始化一个xml实例
doc.Load(strpath);//导入指定的xml文件
XmlNode no = doc.SelectSingleNode("StationList");//指定一个节点
XmlNodeList listnode = no.SelectNodes("StationData");
ti = new TimerCallback(ShowDataToScreenStation);
foreach (XmlNode node in listnode)//遍历所有的stationdata节点
{
weituo = new WeiTuo<XmlNode>(Set_labelText);//委托
StartThread(node);

}}

 public void Set_labelText(XmlNode strText) 
{

StationData stationData = new StationData(strText);
//stationData.IsShow = false;
Program.listStationList.Add(stationData);
this.flowLayoutPanel1.BackColor = Color.Orange;
Label lab = new Label();//实例一个label显示

lab.Name = "lab" + stationData.CardFlagID.ToString();
lab.AutoSize = false;
lab.Size = new Size(280, 140);
lab.BorderStyle = BorderStyle.Fixed3D;
lab.Text = stationData.StatinName;
lab.Font = new Font("宋体", 11);

if (stationData.IsShow)
{
lab.BackColor = Color.Green;
}
if (stationData.IsShow)
{
System.Threading.Timer tim = new System.Threading.Timer(ti, stationData.CardFlagID, 0, 10000);
//超过0秒后,以及此后每隔10秒间隔,都会调用一次由TimerCallback(ShowDataToScreenStation)指定的委托。
dicThread.Add(stationData.CardFlagID.ToString(), tim);

}
this.flowLayoutPanel1.Controls.Add(lab);
}

 private void Run() 
{
Invoke(weituo); //就是这里报错,参数计数不匹配
}

        void StartThread(XmlNode x)
{
// ParameterizedThreadStart ParStart = new ParameterizedThreadStart(Run);
ThreadStart threadtest = new ThreadStart(Run);


Thread threadNew=new Thread(threadtest);
threadNew.Start();

}



请求大神给指导指导,小弟是个新手啊! Invoke参数计数不婚配,求大神指导!

Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}方法体是哪个方法体,是Set_labelText吗?麻烦了。

不明白你这个程序 为什么又是循环foreach 又是System.Threading.Timer 又是线程Thread
大体上就是在面板上生成一个个label,而一个线程包含一个label,label里的数据就是xml的,所以现在想把xml的值传到线程里的label中,不知道这样说你明白不?

你这个写法不对,你把System.Threading.Timer(多线程定时器)放在循环里面,就是每次循环都创建一个定时器....定义一个线程就够了哇
object _lock = new object();
Thread th = new Thread(){new ThreadStart(()=>{ object(lock(_lock){ foreach(...){
读xml,创建lable,AddLable(lable) } })})};th.start();th,isPostBack=true;
public void AddLable(Lable l){this.Invoke(new Action(()=>{ 面板上添加lable }))}
没用VS 可能有点错误
[解决办法]
改成这样应该没问题了
        void StartThread(XmlNode x)
{
new Thread(() => Set_labelText(x)).Start();
}

public void Set_labelText(XmlNode strText)
{
this.Invoke((Action<XmlNode>)delegate(XmlNode node)
{
StationData stationData = new StationData(strText);
//stationData.IsShow = false;
Program.listStationList.Add(stationData);
this.flowLayoutPanel1.BackColor = Color.Orange;
Label lab = new Label();//实例一个label显示

lab.Name = "lab" + stationData.CardFlagID.ToString();
lab.AutoSize = false;
lab.Size = new Size(280, 140);
lab.BorderStyle = BorderStyle.Fixed3D;
lab.Text = stationData.StatinName;
lab.Font = new Font("宋体", 11);

if (stationData.IsShow)
{
lab.BackColor = Color.Green;
}
if (stationData.IsShow)
{
System.Threading.Timer tim = new System.Threading.Timer(ti, stationData.CardFlagID, 0, 10000);


//超过0秒后,以及此后每隔10秒间隔,都会调用一次由TimerCallback(ShowDataToScreenStation)指定的委托。
dicThread.Add(stationData.CardFlagID.ToString(), tim);

}
this.flowLayoutPanel1.Controls.Add(lab);
}, strText);
}

读书人网 >C#

热点推荐