中易网

C#如何处理 委托事件返回的错误

答案:5  悬赏:10  
解决时间 2021-03-15 07:56
在程序里面我用了timer,每5秒钟执行一次keep()函数,如果keep()函数返回失败该怎么处理,我希望如果keep()失败,返回一条错误信息,start()函数接收到这条错误信息后停止timer,
public void start(object ob)
{
t = new System.Timers.Timer(5000); //Create a timer to keep certification
t.Elapsed += new ElapsedEventHandler(keep); //call the method "keep" every five seconds to keep certification
t.Start(); //start timer
}

private void keep(object source, ElapsedEventArgs e)
{///向服务器发送一条消息
Message msg = new Message();
msg.SetType(11);
msg.AddParameter(clientID);
Message smsg = this.SendAndReceive(msg);//发送消息,服务器返回一条消息smsg

if (smsg.messageType == 0) //如果消息种类是0,则说明有错误,应该返回错误信息
{
return;
}

}
求高手指点
最佳答案
m_wndSplitterV.SetColumnInfo(0,rect.Width() *3/4,10);
m_wndSplitterV.SetColumnInfo(1,rect.Width() *1/4,10);
m_wndSplitterH.SetRowInfo(0,rect.Height() *3/4,10);
m_wndSplitterH.SetRowInfo(1,rect.Height() *1/4,10);
全部回答
if (smsg.messageType == 0) //如果消息种类是0,则说明有错误,应该返回错误信息 { t.Stop();//在这停止timer就行了 return; }
这是不可能的,start()函数无法接收另一个线程方法返回的信息啊。你想想就明白了,定时器其实用到了多线程了,在那个线程里面,每隔一定时间,就执行一下你自定的方法keep,也就是说那个keep方法是在另一个线程调用了,而并非在start方法处调用,那么start方法如何接受它返回的信息呢? 有个办法可以你想要的效果,就是事件啊,定一个出错事件,携带错误信息,然后在start方法处加上该事件的处理方法,在处理方法里面处理你的错误信息.,你可以用λ表达式,可以方便地将t这个对象传入你的处理方法内部。
让t在keep方法内有效(比如定义到类变量去)。 然后在错误发生时设置t停止。如果要记录错误信息,同样可以 设置多一个类变量来记录错误信息。 但是由于你使用的Timer不是那个Form.Timer,要注意多线程的风险。
委托定义如下: 复制代码 代码如下:public class socketsp{public delegate void receivecompleted(byte[] receivebuffer, int receivetotallen,exception ex); public receivecompleted receivecompleted;}挂接方定义如下 复制代码 代码如下:public class linkouter{socketsp linkoutersocket = new socketsp(); private void test(socket requesthandlesocket){//此处要挂接 linkoutersocket.receivecompleted 事件,同时想将参数requesthandlesocket传入,以便后续处理。}}第一个想法是利用delegate,但是失败了。因为虽然挂接上去了,委托传进的参数丢了,无法进行后续操作。 复制代码 代码如下:private void test(socket requesthandlesocket){linkoutersocket.receivecompleted += delegate {//to do};}第二个想法是利用action,结果也失败了。ide提示委托action未采用3个参数。 复制代码 代码如下:private void test(socket requesthandlesocket){linkoutersocket.receivecompleted += (action)((outerreceivebuffer, totallen, ex) => {//to do});}第三个想法是利用lambda表达式,先与委托挂接,同时利用局部变量的调用,来实现参数传递到sendresponse函数中,以便后续操作。 复制代码 代码如下:private void test(socket requesthandlesocket){linkoutersocket.receivecompleted += new socketsp.receivecompleted((outerreceivebuffer,totallen,ex) =>{byte[] realouterreceivebuffer = new byte[totallen]; array.copy(outerreceivebuffer, 0, realouterreceivebuffer, 0, totallen); sendresponse(requesthandlesocket, realouterreceivebuffer,"200 ok", "text/html");});}最终用lambda表达式实现了。您可能感兴趣的文章:c#用lambda和委托实现模板方法
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
丁香居这个地址在什么地方,我要处理点事
有没有什么比较伤感的话,最好是一个短些的小
把我永远爱你李碧涵8个字组成藏头诗,急呀!
利物浦大学的入学须知
朱记农家小灶怎么去啊,有知道地址的么
问道中守护怎么来?
苹果树被拔出来,又种下去还能活吗
HD Graphics Family和 GT610哪个好
保温桶里面的格层拿不出来怎么办
龙展超市地址在什么地方,想过去办事
房子125个平方,3380元一个平方,物管费1.2元
雷丁卫浴是名牌吗
夫妻床头吵架床尾合是什么意思?
医疗保险高线好还是低线好,低线每年有小药钱
国内通用航空飞行员发展前景到底怎么样?拿到
推荐资讯
易乐购怎么去啊,有知道地址的么
杨洲乡我想知道这个在什么地方
如何实心自定义的checkbox样式
快三秒酒店这个地址在什么地方,我要处理点事
优尚诚品可靠么,价格贵不贵?
18轮大卡车搬运能手到底怎么买车
金惠大道/东华大道中(路口)怎么去啊,有知道
现在初一,有好几天不上学了。我想问的是,在
长期使用硝苯地平缓释片及尼莫地平片控制血压
支持移动载波聚合的oppo手机终端
求 卫兰 3000 day&night演唱会 的视频 全
魅族3向上键不管用了怎么办
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?