TWX 比较好的多线程使用实例
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using TRS.Export.BLL;
using TRS.Export.Business;
using TRS.Export.Common;
using TRS.Export.Constant;
using TRS.Export.Entity;
using TRS.Export.FrameEntity.Enums;
using TRS.Export.FrameProvider;
using TRS.Export.Param.Bases;
using TRS.Export.Param.Enums;
using TRS.Export.Scheduler.Interfaces;
namespace TRS.Export.Scheduler.Schedulers.Business
{
public class BusinessTaobaoEventScheduler : IScheduler
{
private readonly TBD_EventLogBLL m_objEventLogBLL = new TBD_EventLogBLL();
private readonly TaobaoEventBusiness m_objEventBusiness = new TaobaoEventBusiness();
private readonly BackupTableBusiness m_objBackupBusiness = new BackupTableBusiness();
private readonly string m_HttpResolve = ConfigurationManager.AppSettings["HttpResolve"];
private readonly string m_PCSReceiveCodes = ConfigurationManager.AppSettings["PCSReceiveCodes"];
private const int top = 1000;
private OrderByEnum orderByEnum = OrderByEnum.Asc;
delegate void AsyncExecute(object obj);
public int SleepInterval { get; set; }
public string[] Args { get; set; }
public BusinessTaobaoEventScheduler()
{
SleepInterval = 500;
}
//Business.BusinessTaobaoEventScheduler|LOGISTICS_DISPATCHED#后缀$0,1,2,3,4/5,6,7,8,9
public void Execute()
{
if (Args == null || Args.Length == 0)
{
return;
}
//Args=LOGISTICS_DISPATCHED#后缀$0,1,2,3,4/5,6,7,8,9
//eventType=LOGISTICS_DISPATCHED#后缀$0,1,2,3,4/5,6,7,8,9
string[] eventType = Args[0].Split('|');
if (eventType == null || eventType.Length == 0)
{
return;
}
if (eventType.Length == 1)
{
if (eventType[0].IndexOf("#") < 0)//以EventType分线程
{
ExecuteByEventType(eventType[0]);
}
else if (eventType[0].IndexOf("后缀") > -1)//以EventType+LogID最后一位分线程
{ //array=0,1,2,3,4/5,6,7,8,9
string[] array = eventType[0].Substring(eventType[0].IndexOf("后缀") + 3).Split('/');
for (int i = 0; i < array.Length; i++)
{
if (StaticConstant.ASYNC)
{
AsyncExecute async = new AsyncExecute(ExecuteBySuffix);
async.BeginInvoke(new string[] { eventType[0].Split('#')[0], array[i] }, AsyncCallback, async);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ExecuteBySuffix));
thread.Name = string.Format("报文解析后台Job-{0}", array[i]);
thread.Start(new string[] { eventType[0].Split('#')[0], array[i] });
}
}
}
else if (eventType[0].IndexOf("的地") > -1)//以EventType+DestinationName分线程
{
string[] array = eventType[0].Substring(eventType[0].IndexOf("的地") + 3).Split('/');
for (int i = 0; i < array.Length; i++)
{
if (StaticConstant.ASYNC)
{
AsyncExecute async = new AsyncExecute(ExecuteByDestinationName);
async.BeginInvoke(new string[] { eventType[0].Split('#')[0], array[i] }, AsyncCallback, async);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ExecuteByDestinationName));
thread.Name = string.Format("报文解析后台Job-{0}", eventType[0].Split('#')[0] + "-" + array[i]);
thread.Start(new string[] { eventType[0].Split('#')[0], array[i] });
}
}
}
}
else
{
for (int i = 0; i < eventType.Length; i++)//以EventType分线程
{
if (StaticConstant.ASYNC)
{
AsyncExecute async = new AsyncExecute(ExecuteByEventType);
async.BeginInvoke(eventType[i], AsyncCallback, async);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ExecuteByEventType));
thread.Name = string.Format("报文解析后台Job-{0}", eventType[i]);
thread.Start(eventType[i]);
}
}
}
Console.ReadKey();
}
public void AsyncCallback(IAsyncResult result)
{
AsyncExecute async = (AsyncExecute)result.AsyncState;
async.EndInvoke(result);
}
public void ExecuteByEventType(object obj)
{
while (true)
{
try
{
string threadName = string.Format("报文解析后台Job-{0}", obj);
new ThreadMonitorBusiness().CallbackThread(threadName);
WhereHelper<TBD_EventLog> where = new WhereHelper<TBD_EventLog>();
where.ApeendAnd(a => a.SuccessFlag == 0 && a.ActionTimes < 5);
where.ApeendAnd(a => a.EventType == obj.ToString());
OrderByHelper<TBD_EventLog> orderBy = new OrderByHelper<TBD_EventLog>(a => a.ActionTime, orderByEnum);
List<TBD_EventLog> lstEventLog = m_objEventLogBLL.Select(where, top, null, orderBy);
if (lstEventLog == null || lstEventLog.Count == 0)
{
Console.WriteLine("当前线程:[{0}],没有数据,等待{1}秒后继续...{2}", threadName, 60, DateTime.Now);
Thread.Sleep(60 * 1000);
continue;
}
foreach (var item in lstEventLog)
{
Execute(item);
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, 10 / 1000.00, DateTime.Now);
Thread.Sleep(10);
}
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);
Thread.Sleep(SleepInterval);
}
catch (Exception ex)
{
new EmailBusiness().SendExceptionEmail(ex);
}
}
}
public void ExecuteByDestinationName(object obj)
{
while (true)
{
try
{
string[] array = obj as string[];
if (array == null || array.Length < 2)
{
break;
}
string threadName = string.Format("报文解析后台Job-{0}-{1}", array[0], array[1]);
new ThreadMonitorBusiness().CallbackThread(threadName);
WhereHelper<TBD_EventLog> where = new WhereHelper<TBD_EventLog>();
where.ApeendAnd(a => a.SuccessFlag == 0 && a.ActionTimes < 5);
if (array.Length > 0)
{
where.ApeendAnd(a => a.EventType == array[0]);
}
if (array.Length > 1)
{
where.ApeendAnd(a => a.DestinationName.In(array[1].Split(',')));
}
OrderByHelper<TBD_EventLog> orderBy = new OrderByHelper<TBD_EventLog>(a => a.ActionTime, orderByEnum);
List<TBD_EventLog> lstEventLog = m_objEventLogBLL.Select(where, top, null, orderBy);
if (lstEventLog == null || lstEventLog.Count == 0)
{
Console.WriteLine("当前线程:[{0}],没有数据,等待{1}秒后继续...{2}", threadName, 60, DateTime.Now);
Thread.Sleep(60 * 1000);
continue;
}
foreach (var item in lstEventLog)
{
Execute(item);
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, 10 / 1000.00, DateTime.Now);
Thread.Sleep(10);
}
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);
}
catch (Exception ex)
{
new EmailBusiness().SendExceptionEmail(ex);
}
}
}
public void ExecuteBySuffix(object obj)
{
while (true)
{
try
{
string[] array = obj as string[];
if (array == null || array.Length < 2)
{
break;
}
string threadName = string.Format("报文解析后台Job-{0}-{1}", array[0], array[1]);
new ThreadMonitorBusiness().CallbackThread(threadName);
WhereHelper<TBD_EventLog> where = new WhereHelper<TBD_EventLog>();
where.ApeendAnd(a => a.ActionTime < DateTime.Now);
where.ApeendAnd(a => a.SuccessFlag == 0 && a.ActionTimes < 5);
if (array.Length > 0)
{
where.ApeendAnd(a => a.EventType == array[0]);
}
if (array.Length > 1)
{
//防止并发处理的小措施
where.ApeendAnd(a => a.LogID.Right(array[1].Split(',')));
}
OrderByHelper<TBD_EventLog> orderBy = new OrderByHelper<TBD_EventLog>(a => a.ActionTime, orderByEnum);
List<TBD_EventLog> lstEventLog = m_objEventLogBLL.Select(where, top, null, orderBy);
if (lstEventLog == null || lstEventLog.Count == 0)
{
Console.WriteLine("当前线程:[{0}],没有数据,等待{1}秒后继续...{2}", threadName, 60, DateTime.Now);
Thread.Sleep(60 * 1000);
continue;
}
foreach (var item in lstEventLog)
{
Execute(item);
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, 10 / 1000.00, DateTime.Now);
Thread.Sleep(10);
}
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);
}
catch (Exception ex)
{
new EmailBusiness().SendExceptionEmail(ex);
}
}
}
public void Execute(TBD_EventLog eventLog)
{
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
bool pcs = false;
if (!m_PCSReceiveCodes.IsNullOrEmpty())
{
string[] codes = m_PCSReceiveCodes.Split('|');
foreach (var code in codes)
{
if (eventLog.EventContent.IndexOf(code) > -1)
{
//pcs = true;
}
}
}
if (pcs)
{
string eventContent = eventLog.EventContent;
string destinationName = StringHelper.GetValueByCutStr(ref eventContent, "<consoWarehouseCode>", "</consoWarehouseCode>", false, false);
ExecuteSuccess(eventLog.LogID.Value, 1, destinationName);
Console.WriteLine("当前订单为PCS:[{0}],等待{1}秒后继续...{2}", eventLog.TradeOrderId, 000 / 1000.00, DateTime.Now);
return;
}
else
{
}
ResponseParam response = null;
if (!m_HttpResolve.IsNullOrEmpty())
{
string result = new HttpHelper().Execute(m_HttpResolve, "{\"logId\":" + eventLog.LogID + ",\"appKey\":\"trTaoBaoV02\"}");
if (!result.IsNullOrEmpty())
{
response = JsonConvert.DeserializeObject<ResponseParam>(result);
}
}
else
{
response = m_objEventBusiness.TABAO_EVENT(eventLog);
}
watch.Stop();
if (response == null || !response.success)
{
if (response.result == "2" && eventLog.ActionTimes.Value > 3)
{
ExecuteSuccess(eventLog.LogID.Value);
}
else
{
ExecuteFailure(eventLog.LogID.Value, eventLog.ActionTimes.Value, response.msg);
}
Console.WriteLine("交易订单:{0}分析失败!耗时:{1} {2} {3}", eventLog.TradeOrderId, watch.ElapsedMilliseconds / 1000.00, response == null ? "" : response.msg, DateTime.Now);
}
else
{
ExecuteSuccess(eventLog.LogID.Value);
Console.WriteLine("交易订单:{0}分析成功!耗时:{1} {2} {3}", eventLog.TradeOrderId, watch.ElapsedMilliseconds / 1000.00, response == null ? "" : response.msg, DateTime.Now);
}
}
public void ExecuteFailure(long logID, int actionTimes, string exception)
{
TBD_EventLog update = new TBD_EventLog();
update.LogID = logID;
update.ActionTimes = actionTimes + 1;
update.Exception = exception;
update.ActionTime = DateTime.Now;
if (actionTimes >= 4)
{
update.SuccessFlag = -1;
}
m_objEventLogBLL.Update(update);
}
public void ExecuteSuccess(long logID, int it = 0, string destinationName = null)
{
TBD_EventLog update = new TBD_EventLog();
update.LogID = logID;
update.SuccessFlag = 1;
update.ActionTime = DateTime.Now;
update.IT = it;
if (!destinationName.IsNullOrEmpty())
{
update.DestinationName = destinationName;
}
m_objEventLogBLL.Update(update);
ResponseParam response = m_objBackupBusiness.BackupTable(update);
if (response.success == false)
{
update = new TBD_EventLog();
update.LogID = logID;
update.UpdateTime = DateTime.Now;
update.Exception = response.msg ?? "";
m_objEventLogBLL.Update(update);
}
}
}
}
TWX 比较好的多线程使用实例的更多相关文章
- (转) C#多线程赛跑实例
专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...
- vc 基于对话框多线程编程实例——线程之间的通信
vc基于对话框多线程编程实例——线程之间的通信 实例:
- C#多线程编程实例 螺纹与窗口交互
C#多线程编程实例 螺纹与窗口交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread ...
- c# 多线程 创建对象实例
本次的标题是我在写单例模式的博客时遇到的问题,所以今天专门写了的demo让自己记住怎么简单的使用多线程. 一直纠结的是怎么在for循环中多次实例化对象,好复现单例模式在没有加锁的情况下出现多个实例对象 ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- Java单线程多实例和多线程多实例
最近写了一个程序,是采用多线程往redis里面写入数据,想统计一下一共写了多少条数据,于是用了一个static的全局变量count来累加,这块代码抽象出来就是这样的: public class Mul ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...
- java多线程编程实例
[转]这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下. 1.三个售票窗口同时出售20张票程序分析: ...
- Java 多线程 简单实例 (Runnable)
1.多线程实例 package second; public class A implements Runnable { public char stat = '*'; public void run ...
随机推荐
- 02、微信小程序的数据绑定
02.微信小程序的数据绑定 目录结构: 模板内容: 使用bindtap绑定事件 <!--index.wxml--> <view class="container" ...
- matplotlib图像中文乱码(python3.6)
方法一:(在代码中添加如下代码) import matplotlib #指定默认字体 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matpl ...
- FineReport---样式
1.单元格样式 单元格样式说明 2.预定义样式 预定义样式说明 这里发现,改了样式,服务器更新Congfig,需要重启服务器,这样比较麻烦 我的操作是,先设置预定义样式,然后再点击自定义样式,操作是就 ...
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
转自: http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html 引言 HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然 ...
- 在容器最前面添加DOM元素 parent.insertBefore(new, parent.children[0])
//判断容器当前有没有子级元素,如果没有直接appendChild就行了; if (p.children[0]) { p.insertBefore(span, p.children[0]); } el ...
- Neutron相关资料链接
1.OpenStack Neturon 官方文档: https://docs.openstack.org/mitaka/networking-guide/ 2.Neturon理解系列文章: http: ...
- pip安装lxml报错 Fatal error in launcher: Unable to create process using '"c:\users\administrator\appdata\local\programs\python\python36\python.exe" "C:\Users\Administrator\AppData\L
pip install lxml 安装报错 E:\apollo\spider_code>Fatal error in launcher: Unable to create process usi ...
- 安全必须作为基础,融入到产品开发过程——By Me
安全必须作为基础融入,让公司兄弟姐妹具备足够的安全意识,且逐渐具备必要的安全经验,带着安全思维去执行产品的架构设计.研发.测试.运维(甚至完整的产品生命周期),这是一种有远见.负责人的产品过程!! 下 ...
- POJ_1195 Mobile phones 【二维树状数组】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/33802561 题目链接:id=1195&qu ...
- corethink功能模块探索开发(十七)opencmf.php 配置文件
图样: opencmf.php存在于每个模块的根目录,是模块配置文件. 能进行持久化配置参数保存,一开始我以为是写文件或者做缓存,后来在数据库中发现admin_module表,存储了每个模块的配置参数 ...