C#在窗体程序中的方法 System.Windows.Forms.Control.Invoke 想在控制台程序中使用

我已经在控制台程序中添加了引用System.Windows.Forms 但是程序总是报错:

错误 2 非静态的字段、方法或属性“System.Windows.Forms.Control.Invoke(System.Delegate, params object[])”要求对象引用 E:\Projects\电表取数_控制台\电表取数_控制台\Program.cs 223 17 电表取数_控制台

问一下高手如何解决?
代码是这样的

delegate void SetinfoCallback(byte[] receiveByte, ClassElectricityMeterInfo RTU);

private static void AddMsg(byte[] mybyte, ClassElectricityMeterInfo RTUName) {
try {
this.Invoke (new SetinfoCallback(Setinfo), new object[] { mybyte, RTUName });
}
catch { }
}
想在控制台程序里面用

你这个问题的原因是这样的。。。

AddMsg这个函数被你定义成了static的。就表示这个函数是静态,类不需要实例化也能够使用的方法。

但是你的AddMsg函数里,却使用了Invoke()这个方法。
这个方法不是静态方法,必须要实例化了之后才能使用。所以就产生了这个毛病。

两个方法必须一致。。但是Invoke方法是系统的方法,你没办法改,所以你只能去掉你的AddMsg方法前面的static
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-08
呵呵,如果你 是在static void main 内直接用,肯定出错咯。
该方法应该是非静态方法,静态方法比非静态方法先初始化,所以在静态方法出现时,非静态方法还没有出来,是无法调用的。追问

就是这么两句代码 我并没有在main方法里面写我是直接写在 class program{}里面的。
delegate void SetinfoCallback(byte[] receiveByte, ClassElectricityMeterInfo RTU);

追答

private static void AddMsg不也是静态方法??

第2个回答  2013-06-08
你试试这个先实例化一个Form对象,然后通过这个对象去调用追问

这个我已经试了 不行的。。

第3个回答  2013-06-08
你要把代码贴出来才行追问

代码已经贴出 高手有什么解决方案吗?

C#线程给变量赋值问题!!
这里有两种解决方案,一种是利用button1的委托来赋值,还有一种是把线程访问安全检测给关掉,关掉方法如下:在程序启动时加入System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;就可以了 解决方法2:使用委托的方式访问控件。(示例)A、首先声明一个委托。参数是要和控件需要的参数一致。

this.textBox1.Text=" "; 报错c#
1.窗体Load时候加下面一行代码;System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;2.写委托,通过委托操作控件。

C#为什么要使用Invoke,它和BeginInvoke有什么区别
1、windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让windows程序生生不息。Windows GUI程序的消息循环 Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的while循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列...

C#如何在线程中访问控件对象
void FindFileInDir( ){ if( listView2.InvokeRequired) { \/\/ 跨线程调用 listView2.Invoke(new MethodInvoker(delegate { listView2.Items.Add(path); })); } else { \/\/直接调用 listView2.Items.Add(path); }} \/\/End of FindFileInDir ...

C#在WINFORM的委托与事件
Label1.BeginInvoke(new myDelegate(myMethod), new Object[] {1, "This is the string"});举个例子:新建一个Windows应用程序项目Win1,在窗体Form1中添加一个Button名称为button1,然后转入代码页,按下面修改代码 using System;using System.Windows.Forms;namespace win1 { public partial class Form...

帮忙写一个C#例子:两个进程间通信的问题.
帮忙写一个C#例子,两个进程.利用ip地址和端口来通信.我要看看在两个程序间是如何利用端口来通信的.要有简要注解.如果有多种方法最好全写上.谢谢.写两个程序,A向B发送信息,B收到后返回给A一个结果.发送什么都无所谓.我只是想看看两个程序间通信的代码. 展开 ...

C# 多线程Invoke的问题
在开头应引用 using System.Windows.Forms;这句 public partial class Window1 : Window 改成 public partial class Window1 : Form 在run函数中 labNetStat.Invoke(tWT, new Object[] { "已连接到网络" });改成 \/\/异步调用\/\/不在同一线程,应该一步调用 labNetStat.BeginInvoke(tWT, new ...

如何用C#编写多线程的与窗体交互的程序
Form.Invoke(Delegate method);Form.Invoke(Delegate method, params object[] args);Invoke方法可以由任何线程调用,但只会在创建Form的主线程上执行相应的Delegate。一段最简示例如下:private void button1_Click(object sender, EventArgs e){ new System.Threading.Thread(ThreadAction).Start(); ...

如何使用C#的方法 Dispatcher.Invoke =>
Dispatcher.Invok是WPF中特有的。使用方法如下 1)创建一个“WPF 引用程序”2)在Window1.xaml中添加一个Label 3)在后台代码Window1.xaml.cs中 using System;using System.Windows;using System.Threading;namespace WpfApplication3{ \/\/\/ \/\/\/ Window1.xaml 的交互逻辑 \/\/\/ public p...

c#如何在多线程的子线程里调用外部程序。并运行10秒如何终止它。。
1.新开的线程是无法直接访问UI控件的,如果需要访问,可以通过控件的Invoke方法,或者用 System.Threading.SynchronizationContext.Current.Post方法 2.一定不要在控件的内部事件处理方法里面使用Sleep等线程暂停方法!像我这样写就不会阻塞了:private void button1_Click(object sender, EventArgs e){...

相似回答