我创建了一个委托事件(SetStatusEvent)来执行此 *** 作.当我在EventHandler(usbforProcessExited)之外调用此事件时似乎很好但是当我从usbforProcessExited调用它时它会出错 –
object reference not set to an instance of an object
主要形式
public partial class main : Form{ b RSSet = new b(); public main() { InitializeComponent(); RSSet.SetStatusEvent += new RemoteS.SetStatus(updateStatus); } private voID button1_Click(object sender,EventArgs e) { RSSet.FormatUSB(); } private delegate voID UpdateStatus(int i,string str,color clr); private voID SetStatus(int i,color clr) { this.progressbar1.Value = i; this.lbl_status.Forecolor = clr; this.lbl_status.Text = str; } private voID updateStatus(int i,String msg,color color) { object[] p = GetInokerPara(i,msg,color); BeginInvoke(new UpdateStatus(SetStatus),p); } private object[] GetInokerPara(int progress,string msg,color color) { object[] para = new object[3]; para[0] = progress; para[1] = msg; para[2] = color; return para; }}
b级
class b{ public delegate voID SetStatus(int i,color color); public event SetStatus SetStatusEvent; System.Diagnostics.Process usbfor = new System.Diagnostics.Process(); public voID FormatUSB() { usbfor.StartInfo.filename = @"usbformat.bat"; usbfor.EnableRaisingEvents = true; usbfor.Exited += new EventHandler(usbforProcessExited); usbfor.Start(); } public voID usbforProcessExited(object sender,EventArgs f) { SetStatusEvent(100,"DONE",color.Green); //ERROR HERE! (object reference not set to an instance of an object }}
问题出在哪儿?
解决方法 你有一个竞争条件:usbforProcessExited在b的构造函数中被订阅,并且可能在调用RSSet.SetStatusEvent = new RemoteS.SetStatus(updateStatus)之前调用.
您只应在订阅SetStatusEvent后调用usbfor.Start().
一个相关的问题是该事件将在另一个线程上运行.您应该在启动进程之前设置RSSet.SynchronizingObject,以便您的事件处理程序可以修改表单而无需手动调用Invoke / BeginInvoke.
总结以上是内存溢出为你收集整理的c# – 为什么一个事件是空的? (你调用的对象是空的)全部内容,希望文章能够帮你解决c# – 为什么一个事件是空的? (你调用的对象是空的)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)