using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Data; using System.Runtime.Serialization; using System.IO.Compression; using System.Collections; using System.Threading; namespace Core.Mes.Common { public class Utility { #region dataset to byte[] /// /// 序列化数据集 /// /// /// public static byte[] SerializeDataSet(DataSet ds) { byte[] buffer = null; ds.RemotingFormat = SerializationFormat.Binary; MemoryStream ms = new MemoryStream(); IFormatter bf = new BinaryFormatter(); bf.Serialize(ms, ds); ds.Clear(); ds.Dispose(); ds = null; buffer = ms.ToArray(); ms.Close(); ms.Dispose(); ms = null; return buffer; } /// /// 反序列化数据集 /// /// /// public static DataSet ReSerializable(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer); Array.Resize(ref buffer, 0); IFormatter bf = new BinaryFormatter(); object obj = bf.Deserialize(ms); DataSet ds = (DataSet)obj; ms.Close(); ms.Dispose(); return ds; } /// /// 序列化对象 /// /// /// public static byte[] SerializeObject(Object obj) { byte[] buffer = null; MemoryStream ms = new MemoryStream(); IFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); buffer = ms.ToArray(); ms.Close(); ms.Dispose(); ms = null; return buffer; } /// /// 反序列化对象 /// /// /// public static Object ReSerializeObject(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer); IFormatter bf = new BinaryFormatter(); object obj = bf.Deserialize(ms); ms.Close(); ms.Dispose(); return obj; } /// /// 序列化对象 /// /// /// public static byte[] SerializeAndCompressObject(Object obj) { byte[] buffer = null; MemoryStream ms = new MemoryStream(); IFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); buffer = ms.ToArray(); ms.Close(); ms.Dispose(); ms = null; return CompressBytes(buffer); } /// /// 反序列化对象 /// /// /// public static Object ReSerializeCompressedObject(byte[] buffer) { MemoryStream ms = new MemoryStream(Decompress(buffer)); IFormatter bf = new BinaryFormatter(); object obj = bf.Deserialize(ms); ms.Close(); ms.Dispose(); return obj; } #endregion #region 压缩、解压缩 //压缩字节 public static byte[] CompressBytes(byte[] bytes) { /* 1.创建压缩的数据流 2.设定compressStream为存放被压缩的文件流,并设定为压缩模式 3.将需要压缩的字节写到被压缩的文件流 */ using (MemoryStream compressStream = new MemoryStream()) { using (GZipStream zipStream = new GZipStream(compressStream, CompressionMode.Compress)) zipStream.Write(bytes, 0, bytes.Length); Array.Resize(ref bytes, 0); return compressStream.ToArray(); } } //解压缩字节 public static byte[] Decompress(byte[] bytes) { /* 1.创建被压缩的数据流 2.创建zipStream对象,并传入解压的内存流 3.创建目标流 4.zipStream拷贝到目标流 5.返回目标流输出字节 * */ byte[] buffer = new byte[4096];//定义数据缓冲 using (MemoryStream compressStream = new MemoryStream(bytes)) { using (GZipStream zipStream = new GZipStream(compressStream, CompressionMode.Decompress)) { using (MemoryStream resultStream = new MemoryStream()) { int offset = 0; while ((offset = zipStream.Read(buffer, 0, buffer.Length)) != 0) { resultStream.Write(buffer, 0, offset); } return resultStream.ToArray(); } } } } ////////////////////////////////////////////////////////////////////////// ///读取Stream ////////////////////////////////////////////////////////////////////////// public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) { int offset = 0; int totalCount = 0; while (true) { int bytesRead = stream.Read(buffer, offset, 100); if (bytesRead == 0) { break; } offset += bytesRead; totalCount += bytesRead; } return totalCount; } #endregion } public class TaskManager { private Thread taskMonitor = new Thread(new ThreadStart(Kill_InvalidTask)); public static Hashtable Tasks = new Hashtable(); public bool CreateTask(TaskType taskType, object param, out string outmsg) { outmsg = ""; TaskInfo ti = null; do { ti = new TaskInfo(); } while (Tasks.Contains(ti.UniqueID)); if (!ti.CreateTask(taskType, param, out outmsg)) { return false; } Tasks.Add(ti.UniqueID, ti); return true; } public void SetTouch(String TaskID) { if (Tasks.Contains(TaskID)) { TaskInfo ti = (TaskInfo)Tasks[TaskID]; ti.SetTouch(); } } public static void Kill_InvalidTask() { do { Thread.Sleep(30000); try { string outmsg = ""; DateTime time_now = DateTime.Now; foreach (string key in Tasks.Keys) { try { TaskInfo ti = (TaskInfo)(Tasks[key]); if (ti.PlanEndTime < time_now) { if (ti.EndTask(out outmsg)) { Tasks.Remove(key); } } } catch { } //继续判断其他任务 } } catch { } } while (true); } } public class TaskInfo { TimeSpan _keepTimes = new TimeSpan(0, 15, 0); DateTime _startTime; public DateTime StartTime { get { return _startTime; } } DateTime _touchTime; public DateTime LastTouchTime { get { return _touchTime; } } DateTime _planEndTime; public DateTime PlanEndTime { get { return _planEndTime; } } string _id; public String UniqueID { get { return _id; } } TaskType _taskType; object _parameter; public TaskInfo(string _ID) { SetID(_ID); _startTime = DateTime.Now; _touchTime = _startTime; _keepTimes = new TimeSpan(0, 15, 0); _planEndTime = _touchTime.Add(_keepTimes); } public TaskInfo() { _startTime = DateTime.Now; _touchTime = _startTime; _keepTimes = new TimeSpan(0, 15, 0); SetID(_startTime.Ticks.ToString()); _planEndTime = _touchTime.Add(_keepTimes); } public void SetID(string _ID) { if (string.IsNullOrEmpty(_ID)) return; _id = _ID.ToString(); } public void SetTouch() { _touchTime = DateTime.Now; _planEndTime = _touchTime.Add(_keepTimes); } public void SetKeepTime(TimeSpan ts) { if (ts.Ticks <= 0) return; _keepTimes = ts; _planEndTime = _touchTime.Add(_keepTimes); } public bool CreateTask(TaskType taskType, object param, out string outmsg) { bool success = false; outmsg = ""; switch (taskType) { case TaskType.SendFile: if (param.GetType() != typeof(string)) { outmsg = "设置[文件发送]任务失败!,参数格式不正确!"; return success; } string p = ((string)(param)).Trim(); if (string.IsNullOrEmpty(p) || !File.Exists(p)) { outmsg = "设置[文件发送]任务失败!,文件不存在!"; return success; } _taskType = taskType; _parameter = param; success = true; break; default: break; } return success; } public bool EndTask(out string outmsg) { bool success = false; outmsg = ""; switch (_taskType) { case TaskType.SendFile: string p = ((string)(_parameter)).Trim(); if (File.Exists(p)) { try { File.Delete(p); } catch (Exception ex) { outmsg = "删除[文件发送]任务失败!\n" + ex.Message; } } success = true; break; default: break; } return success; } } public enum TaskType { SendFile = 1 }; }