110,535
社区成员
发帖
与我相关
我的任务
分享
public class MyTaskList
{
public List<Action> Tasks = new List<Action>();
public void Start()
{
for (var i = 0; i < 5; i++)
StartAsync();
}
public event Action Completed;
public void StartAsync()
{
lock (Tasks)
{
if (Tasks.Count > 0)
{
var t = Tasks[Tasks.Count - 1];
Tasks.Remove(t);
ThreadPool.QueueUserWorkItem(h =>
{
t();
StartAsync();
});
}
else if (Completed != null)
Completed();
}
}
}
测试 var rnd = new Random();
var lst = new MyTaskList();
for (var i = 0; i < 100; i++)
{
var s = rnd.Next(10);
var j = i;
var 测试任务 = new Action(() =>
{
Console.WriteLine(string.Format("第{0}个任务(用时{1}秒)已经开始", j, s));
Thread.Sleep(s * 1000);
Console.WriteLine(string.Format("第{0}个任务(用时{1}秒)已经结束", j, s));
});
lst.Tasks.Add(测试任务);
}
lst.Completed += () => Console.WriteLine("____________________没有更多的任务了!");
lst.Start();
public class MyTaskList
{
public List<Action> Tasks = new List<Action>();
public void Start()
{
for (var i = 0; i < 5; i++)
StartAsync();
}
public void StartAsync()
{
lock (Tasks)
{
if (Tasks.Count > 0)
{
var t = Tasks[Tasks.Count - 1];
Tasks.Remove(t);
ThreadPool.QueueUserWorkItem(h =>
{
t();
StartAsync();
});
}
}
}
}
然后你可以使用一个console程序测试 var rnd = new Random();
var lst = new MyTaskList();
for (var i = 0; i < 100; i++)
{
var s = rnd.Next(10);
var j = i;
var 测试任务 = new Action(() =>
{
Console.WriteLine(string.Format("第{0}个任务(用时{1}秒)已经开始", j, s));
Thread.Sleep(s * 1000);
Console.WriteLine(string.Format("第{0}个任务(用时{1}秒)已经结束", j, s));
});
lst.Tasks.Add(测试任务);
}
lst.Start();
Console.WriteLine("________________________End");
这里,自动加入的100个测试任务,每一个运行时间都是不定的、随机的,这是其一。
其二就是,这里的 StartAsync 方法瞬间就结束了,根本不会阻塞,也不会等待什么 while 循环结束。
var workList = new SafedQueue<string>();
for (int i = 0; i < 100; i++)
{
workList.Enqueue(i.ToString());
}
for(int i = 0; i< 5; i++)
{
ThreadPool.QueueUserWorkItem(obj =>
{
while (true)
{
var item = workList.Dequeue();
if (item == null)
{
break;
}
Thread.Sleep(1000);
Console.WriteLine(item);
}
});
}
volatile int number;
for(int i = 0; i< 5; i++)
{
ThreadPool.QueueUserWorkItem(obj =>
{
while(number < 100)
{
doSthing(number);
number++;
}
}
}