首页 新闻 会员 周边

多线程发送模版消息

0
悬赏园豆:5 [已解决问题] 解决于 2017-05-17 20:09

需求:用多线程发送模版消息

问题每次发送的数据都不符会实际数量 (本来应该是100000 但实际是只发送了50000)

如果我用单线程是可以全部发送出去的,但是所需时间非常长三个小时左右

现在我有10组数据都是放在List<User>里面

每一组数据有一个字段openids存放了10000条数据

这样就有10*10000 条数据要发送出去

public class User
    {
        public int total { get; set; }
        public int count { get; set; }
        public string next_openid { get; set; }
        public List<string> openids { get; set; }
    }

下面是用线程的方式发送

List<Models.User> list=new List<Models.User> //list.count=10
.....

Parallel.For(0, list.Count, (i, loopState) =>
{
    var item = list[i].openids; //10000条数据
     foreach (var openid in item) 
    {
   //循环10000次 Send(openid); } });

send 方法 所用的时间比较长

public void Send(string openId)
        {

            string templateId = TemplateMsg.TempId;
            try
            {
                string url = TemplateMsg.Link;
                var items =JArray.Parse(TemplateMsg.Item);
                Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TempleteModel m = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TempleteModel();
                var data = new
                {
                    first = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(TemplateMsg.First),
                    keyword1 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(GetValue(items, "keyword1")),
                    keyword2 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(GetValue(items, "keyword2")),
                    keyword3 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(GetValue(items, "keyword3")),
                    keyword4 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(GetValue(items, "keyword4")),
                    
                    remark = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(TemplateMsg.Remark)
                };
                m.data = data;
                m.template_id = templateId; //TM00277
                m.topcolor = "#ff0000";
                m.touser = openId;
                m.url = url;
                var accesstoken = WeiXinServer.AccessTokenServer.GetAccessToken(App.Helper.WxBaseConfig.AppID, App.Helper.WxBaseConfig.AppSecret);
                var n= Senparc.Weixin.MP.AdvancedAPIs.TemplateApi.SendTemplateMessage(accesstoken, openId, templateId, "#dddddd", url, data);
                App.Helper.Log.WriteNode("模板发结果:errcode=" + n.errcode+"&errmsg=" +n.errmsg+"&msgid="+ n.msgid, "tempmsg.txt");
            }
            catch (Exception ex)
            {
                string msg = ex.Message;
            }
        }

 没有豆豆了,全部奉上了!

生活还是要继续的主页 生活还是要继续 | 初学一级 | 园豆:10
提问于:2017-03-16 15:24
< >
分享
最佳答案
0

并行库使用没问题,但你最后对应的委托方法有问题:catch了后那个是干啥?

另:如果的确是10万数据这样调的话是不可取的,不能光考虑你这边消耗的速度,你后面服务端快不起来你这边也是白搭,还有中间任何时候出现一个错误你怎么办?

收获园豆:4
Daniel Cai | 专家六级 |园豆:10424 | 2017-03-17 10:09

谢谢你的答复!

catch:我是打算记录错误日志的,

这个问题一直没有解决,为什么微信发送一组文章几百万的用户立即就可以收到?

就这个问题,能不能提供你的方案参考?

 

生活还是要继续 | 园豆:10 (初学一级) | 2017-03-17 10:22

@生活还是要继续: 那种不是推送,而是长连接轮询。

你的这种情况由于io占比太高,你线程开到极限也没太大意义。建议是把这些丢到队列中去,后面去拉取后再发送,发送成功从队列中去掉,不成功可以重新执行。这样你觉得一个消费者慢了就用多个。

Daniel Cai | 园豆:10424 (专家六级) | 2017-03-17 14:00

@Daniel Cai: 

好的,谢谢提供的思路

生活还是要继续 | 园豆:10 (初学一级) | 2017-03-17 14:30
其他回答(1)
0

list[i].openids.AsParallel().ForAll(a=>Send(a))

收获园豆:1
吴瑞祥 | 园豆:29449 (高人七级) | 2017-03-16 16:18

还是这样的,没有完整的输出

支持(0) 反对(0) 生活还是要继续 | 园豆:10 (初学一级) | 2017-03-16 17:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册