Я собирал небольшую небольшую демоверсию, чтобы использовать длительный метод, имитированный с помощью Thread.Sleep()
, и хотел добавить асинхронный способ, чтобы легко перейти от синхронного процесса до асинхронного. Вот исходный код:Разница между Task.Delay() и новой задачей (() => Thread.Sleep())
private void button1_Click(object sender, EventArgs e)
{
LongProcess();
}
private void LongProcess()
{
for (int i = 0; i < 33; i++)
{
progressBar1.Value += 3;
Thread.Sleep(1000);
}
progressBar1.Value += 1;
}
Я думал, что я мог бы просто изменить Thread.Sleep(1000)
в new Task(()=>Thread.Sleep(1000))
, например, так:
private void button1_Click(object sender, EventArgs e)
{
LongProcess();
}
private async void LongProcess()
{
for (int i = 0; i < 33; i++)
{
progressBar1.Value += 3;
await new Task(()=>Thread.Sleep(1000));
}
progressBar1.Value += 1;
}
Однако это никогда не возвращается в цикл после первого ОЖИДАНИЯ. Если я изменяю Thread.Sleep на Task.Delay, все работает, но я не понимаю, почему мой код не работает. Я предполагаю, что что-то блокируется навсегда, но это не совсем понятно. Может ли кто-нибудь объяснить, как работает мой код, и возможное решение, не изменяя Task.Delay (просто чтобы я мог получить другую перспективу, как это работает)?
'ждут новую задачу (() => Thread.Sleep (1000))' это косвенный способ сделать то же самое, что и 'Thread.Sleep (1000)'. Кроме того, он несовместим с .Net 2.0/3.5 – i486