在程序里面我用了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;
}
}
求高手指点
C#如何处理 委托事件返回的错误
答案:5 悬赏:10
解决时间 2021-03-15 07:56
- 提问者网友:伪善人独行者
- 2021-03-14 18:53
最佳答案
- 二级知识专家网友:哥在撩妹请勿打扰
- 2021-03-14 20:31
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);
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);
全部回答
- 1楼网友:滚出爷的世界
- 2021-03-14 22:55
if (smsg.messageType == 0) //如果消息种类是0,则说明有错误,应该返回错误信息
{
t.Stop();//在这停止timer就行了
return;
}
- 2楼网友:抱不住太阳的深海
- 2021-03-14 22:47
这是不可能的,start()函数无法接收另一个线程方法返回的信息啊。你想想就明白了,定时器其实用到了多线程了,在那个线程里面,每隔一定时间,就执行一下你自定的方法keep,也就是说那个keep方法是在另一个线程调用了,而并非在start方法处调用,那么start方法如何接受它返回的信息呢?
有个办法可以你想要的效果,就是事件啊,定一个出错事件,携带错误信息,然后在start方法处加上该事件的处理方法,在处理方法里面处理你的错误信息.,你可以用λ表达式,可以方便地将t这个对象传入你的处理方法内部。
- 3楼网友:承载所有颓废
- 2021-03-14 22:38
让t在keep方法内有效(比如定义到类变量去)。
然后在错误发生时设置t停止。如果要记录错误信息,同样可以 设置多一个类变量来记录错误信息。
但是由于你使用的Timer不是那个Form.Timer,要注意多线程的风险。
- 4楼网友:承载所有颓废
- 2021-03-14 21:10
委托定义如下:
复制代码 代码如下: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和委托实现模板方法
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯