c# – 为什么一个事件是空的? (你调用的对象是空的)

c# – 为什么一个事件是空的? (你调用的对象是空的),第1张

概述我有一个带有按钮,标签和进度条的表单,因此当我单击该按钮时,它会创建一个b类实例来运行一个进程.一旦完成该过程,它将调用EventHandler在主窗体的标签中显示“done”! 我创建了一个委托事件(SetStatusEvent)来执行此 *** 作.当我在EventHandler(usbforProcessExited)之外调用此事件时似乎很好但是当我从usbforProcessExited调用它时它 我有一个带有按钮,标签和进度条的表单,因此当我单击该按钮时,它会创建一个b类实例来运行一个进程.一旦完成该过程,它将调用EventHandler在主窗体的标签中显示“done”!

我创建了一个委托事件(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# – 为什么一个事件是空的? (你调用的对象是空的)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存