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} 歡迎您 !");
}
}
}