Вот консольная программа, которая хочет, чтобы 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, все потоки начинаются и заканчиваются во флэш-памяти.
Делает Thread.Sleep
влияет на другие темы?Есть ли вообще сделать простой простой?
/ ----------------------------- edit -----------------------------
такая же проблема возникает и в:
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();
}
---------------------- Редактировать ------------------------
наконец-то я нашел прекрасный способ заменить нить.спи
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 ");
}