需求:用多线程发送模版消息
问题:每次发送的数据都不符会实际数量 (本来应该是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; } }
没有豆豆了,全部奉上了!
并行库使用没问题,但你最后对应的委托方法有问题:catch了后那个是干啥?
另:如果的确是10万数据这样调的话是不可取的,不能光考虑你这边消耗的速度,你后面服务端快不起来你这边也是白搭,还有中间任何时候出现一个错误你怎么办?
谢谢你的答复!
catch:我是打算记录错误日志的,
这个问题一直没有解决,为什么微信发送一组文章几百万的用户立即就可以收到?
就这个问题,能不能提供你的方案参考?
@生活还是要继续: 那种不是推送,而是长连接轮询。
你的这种情况由于io占比太高,你线程开到极限也没太大意义。建议是把这些丢到队列中去,后面去拉取后再发送,发送成功从队列中去掉,不成功可以重新执行。这样你觉得一个消费者慢了就用多个。
@Daniel Cai:
好的,谢谢提供的思路
list[i].openids.AsParallel().ForAll(a=>Send(a))
还是这样的,没有完整的输出