加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 与过期异步调用操作

发布时间:2020-12-15 21:13:03 所属栏目:百科 来源:网络整理
导读:我有一个经典的异步消息调度问题.本质上,我需要异步调度消息,然后在调度完成时捕获消息响应.问题是,我似乎无法弄清楚如何使任何一个请求周期自我过期和短路. 以下是我目前使用的模式示例: 为invokation定义的委托 private delegate IResponse MessageDispat
我有一个经典的异步消息调度问题.本质上,我需要异步调度消息,然后在调度完成时捕获消息响应.问题是,我似乎无法弄清楚如何使任何一个请求周期自我过期和短路.

以下是我目前使用的模式示例:

为invokation定义的委托

private delegate IResponse MessageDispatchDelegate(IRequest request);

使用回调发送消息

var dispatcher = new MessageDispatchDelegate(DispatchMessage);
dispatcher.BeginInvoke(requestMessage,DispatchMessageCallback,null);

发送消息

private IResponse DispatchMessage(IRequest request)
{
  //Dispatch the message and throw exception if it times out
}

获取调度结果作为响应或异常

private void DispatchMessageCallback(IAsyncResult ar)
{
  //Get result from EndInvoke(r) which could be IResponse or a Timeout Exception
}

我无法弄清楚的是如何在DispatchMessage方法中干净地实现超时/短路过程.任何想法,将不胜感激

解决方法

var dispatcher = new MessageDispatchDelegate(DispatchMessage);

        var asyncResult = dispatcher.BeginInvoke(requestMessage,null);
        if (!asyncResult.AsyncWaitHandle.WaitOne(1000,false))
        {
             /*Timeout action*/
        }
        else
        {
            response = dispatcher.EndInvoke(asyncResult);
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读