`
ikeycn
  • 浏览: 146824 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

.net使用delegate实现异步调用

阅读更多
最近在应用中,需要实现一个异步调用,由于刚接触.net不深,还是费了不少劲的,不过最后总算也能用了。下面是代码,记录下来,以备以后使用。
实现异步调用大致需要三步:
1、定义实现自身功能的方法,该方法中应该是实现一个完整的需要被异步实现的功能,如下:
private void SyncSoldTradesTop2Local(string session, string nick, int totalSize)
        {
            int totalpagesize = 0;
            if (totalSize % MAX_TRADE_PAGE_SIZE == 0)
            {
                totalpagesize = totalSize / MAX_TRADE_PAGE_SIZE;
            }
            else
            {
                totalpagesize = totalSize / MAX_TRADE_PAGE_SIZE + 1;
            }

            TradesSoldGetRequest req = new TradesSoldGetRequest();
            req.Fields = "tid";
            req.PageSize = MAX_TRADE_PAGE_SIZE;
            TradesSoldGetResponse rsp;
            for (var i = 1; i <= totalpagesize; i++)
            {
                int repeatNum = 0;
                req.PageNo = i;
                while (repeatNum++ < 5)     //如果失败,最多重试5次
                {
                    rsp = client.Execute(req, session);
                    if (rsp != null && !rsp.IsError && rsp.Trades.Count > 0)
                    {
                        BatchAddTradeFromTop2Local(rsp.Trades, session);
                        break;
                    }
                }
            }
            UpdateUserTradeSync(nick);
        }

2. 定义一个与上面的方法具有相同参数列表的delegate声明,如下:
	delegate void GetAllSoldTradesFromTopDelegate(string session, string nick, int totalSize);


3. 通过这两步已基本完成了异步的声明,如果需要使用,则还需要下面这一步:定义delegate对象,并调用其BeginInvoke方法,如下
	new GetAllSoldTradesFromTopDelegate(SyncSoldTradesTop2Local).BeginInvoke(session, nick, totalSize, null, workerDelegate);


上面这句代码首先通过delegate对象,把步骤1中定义的方法进行包装成异步理:new GetAllSoldTradesFromTopDelegate(SyncSoldTradesTop2Local)
然后调用BeginInvoke方法就可以实现对SyncSoldTradesTop2Local的异步调用了。在BeginInvoke方法的参数列表中,前三个是和自己定义的方法中的参数列表一致的,最后两个是和异步完成后的回调相关的,根据需要自行设置。
分享到:
评论
Global site tag (gtag.js) - Google Analytics