这是一个控制台程序,希望 10 个线程批量启动,等待 5 秒,然后批量停止。
static void Main(string[] args)
{
System.Threading.Tasks.Parallel.For(0, 10, (index) =>
{
Action<int> act = (i) =>
{
Console.Write("start {0} ", i);
Thread.Sleep(5000);
};
act.BeginInvoke(index, OnTaskComplete, index);
});
Console.ReadKey();
}
static void OnTaskComplete(IAsyncResult res)
{
Console.Write("finish {0} ", res.AsyncState);
}
但结果不是我所期望的,10 个线程一个接一个地启动(大约 1 秒间隔),甚至一些“完成”在一些“开始”之前出现。
当注释掉 Thread.Sleep 时,所有线程都在 flash 中开始和结束。
Thread.Sleep
会影响其他线程吗?反正有没有纯粹的空闲时间?
/ - - - - - - - - - - - - - - -编辑 - - - - - - - - - - ----------
同样的问题也发生在:
static void Main(string[] args)
{
System.Threading.Tasks.Parallel.For(0, 10, (index) =>
{
Console.Write("start {0} ", index);
Thread.Sleep(5000);
Console.Write("fnish {0} ", index);
});
Console.ReadKey();
}
- - - - - - - - - - - 编辑 - - - - - - - - - - - -
最后我找到了一个可爱的方法来代替 thread.sleep
static void Main(string[] args)
{
System.Threading.Tasks.Parallel.For(0, 10, (index) =>
{
Console.Write("start {0} ", index);
var t1 = new System.Threading.Timer(new TimerCallback(MyTimerCallback), index, 5000, 0);
});
Console.ReadKey();
}
static void MyTimerCallback(object o)
{
Console.Write("Timer callbacked ");
}