Queue

using System;
dom

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace WfConcurrentTest
{
    public static class TQueue
    {
        public static int pages;
        public static async Task RunProgram()
        {
            #region 建立任務序列,產生工做量
            //1 建立一個任務序列
            var taskQueue = new ConcurrentQueue<CustomTask>();
            //2 建立一個取消標誌,用來將任務放到隊列後中止工做的。
            var cts = new CancellationTokenSource();
            //3 啓動一個單獨的工做者線程來將任務放入隊列中(爲異步處理產生工做量)
            var taskSource = Task.Run(() => TaskProducer(taskQueue, pages));
            #endregion
            //建立4個工做者,隨機等待一段時間,從任務隊列中獲得一個任務,一直重複這個過程
            Task[] Workers = new Task[4];
            for (int i = 1; i <= 4; i++)
            {
                string workerid = i.ToString();
                Workers[i - 1] = Task.Run(() => TaskWorker(taskQueue, $"旅行社 {workerid}", cts.Token));
            }
            await taskSource;//等待單個工做者線程結束
            cts.CancelAfter(200);
            await Task.WhenAll(Workers);//待四個工做者均完成任務
        }
        private static async Task TaskWorker(ConcurrentQueue<CustomTask> Queue, string name, CancellationToken token)
        {
            CustomTask workItem;
            bool dequeueSuccessful = false;
            await GetRandomDelay();
            do
            {
                dequeueSuccessful = Queue.TryDequeue(out workItem);//償試將任務移出隊列
                if (dequeueSuccessful)
                {
                    workItem.Dothing();
                     await GetRandomDelay();
                }
            } while (!token.IsCancellationRequested);
        }
        private static Task GetRandomDelay()
        {
            int delay = new Random(DateTime.Now.Millisecond).Next(1, 500);
            return Task.Delay(delay);
        }
        /// <summary>
        /// 產生工做量
        /// 該方法爲Static靜態,static async Task
        /// </summary>
        /// <param name="Queue"></param>
        /// <returns></returns>
        static async Task TaskProducer(ConcurrentQueue<CustomTask> Queue, int pages)
        {
            for (int i = 1; i < pages; i++)
            {
                await Task.Delay(50);
                var workItem = new CustomTask(i.ToString()); //生成任務
                Queue.Enqueue(workItem);//向Queue中添加元素
                 Console.WriteLine($"{DateTime.Now}  計劃: {workItem.Url} 已經下達");
            }
        }

    }
    class CustomTask
    {
        public string Url;
        public CustomTask(string url)
        {
            this.Url = url;
        }
        public void Dothing()
        {
             Console.WriteLine($"{DateTime.Now}  {Url} 歡迎您 !");
        }
    }
}
相關文章
相關標籤/搜索