简单的队列应用

发布时间:2017/12/1 10:38:09 次浏览

using Newtonsoft.Json;
using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Web;

namespace TestQuenu
{
    /// <summary>
    /// 文件转码简单队列
    /// </summary>
    public class TransCodQuenuHelp
    {

        /// <summary>
        /// 待转码的文件队列
        /// </summary>
        private static ConcurrentQueue<string> waitTransFileQuene = new ConcurrentQueue<string>();

        /// <summary>
        /// 系列化文件存放位置
        /// </summary>
        private static string waitTransFileSavePath = HttpContext.Current.Server.MapPath("~/1.txt");

        /// <summary>
        /// 等待毫秒数
        /// </summary>
        private const int waitTime = 300000;

        /// <summary>
        /// 日志来源
        /// </summary>
        private const string source = "";

        /// <summary>
        /// 日志名称
        /// </summary>
        private const string logName = "";

        /// <summary>
        /// 初始化队列
        /// </summary>
        public static void init()
        {
            initLog();
            ReadWaitTransFile();

            /*开启线程用于定时任务*/
            Thread thread = new Thread(new ThreadStart(ListenceTransCode));
            thread.Start();
            thread.IsBackground = true;
        }

        /// <summary>
        /// 初始化日志
        /// </summary>
        private static void initLog()
        {
            if (!EventLog.SourceExists(source))
            {
                EventLog.CreateEventSource(source, logName);
            }
        }


        /// <summary>
        /// 转码监听
        /// </summary>
        private static void ListenceTransCode()
        {
            while (true)
            {
                if (!waitTransFileQuene.IsEmpty)
                {
                    string curTransFile = string.Empty;
                    bool isSuc = waitTransFileQuene.TryDequeue(out curTransFile);
                    if (isSuc)
                    {
                        //转码
                        try
                        {
                            Stopwatch stopwatch = new Stopwatch();
                            stopwatch.Start();

                            //doSomething();

                            stopwatch.Stop();
                            TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间
                            string msg = string.Format("{0}成功,用时{1}分钟", curTransFile, timespan.TotalMinutes);
                            EventLog.WriteEntry(source, msg, EventLogEntryType.Information);
                        }
                        catch (Exception ex)
                        {
                            EventLog.WriteEntry(source, ex.Message, EventLogEntryType.Error);
                        }
                    }
                }
                else
                {
                    Thread.Sleep(waitTime);
                }
            }
        }

        /// <summary>
        /// 从文件中读取未转码的文件列表
        /// </summary>
        private static void ReadWaitTransFile()
        {
            if (File.Exists(waitTransFileSavePath))
            {
                string waitTransFile = File.ReadAllText(waitTransFileSavePath);
                waitTransFileQuene = JsonConvert.DeserializeObject<ConcurrentQueue<string>>(waitTransFile);
            }
        }

        /// <summary>
        /// 保存未转码的文件类别到文件
        /// </summary>
        public static void SaveWaitTransFile()
        {
            if (!waitTransFileQuene.IsEmpty)
            {
                File.WriteAllText(waitTransFileSavePath, JsonConvert.SerializeObject(waitTransFileQuene));
            }
        }

        /// <summary>
        /// 添加新的任务
        /// </summary>
        /// <param name="fileName">文件全名</param>
        public static void Add(string fileName)
        {
            waitTransFileQuene.Enqueue(fileName);
        }

    }
}