Kev*_*lia 3 c# multithreading asynchronous thread-sleep
我正在整理一个小小的演示来采用模拟的长时间运行方法,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;
}
Run Code Online (Sandbox Code Playgroud)
我以为我可以简单地Thread.Sleep(1000)改成a 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;
}
Run Code Online (Sandbox Code Playgroud)
然而,在第一次等待之后,这永远不会返回到循环.如果我将Thread.Sleep更改为Task.Delay一切正常,但我不明白为什么我的代码不起作用.我认为某些东西会永远被阻挡,但它并没有多大意义.任何人都可以解释我的代码如何工作,以及一个可能的解决方案,而无需更改为Task.Delay(只是这样我可以得到另一个视角,如何工作)?
Task.Delay与盯着任务不一样Thread.Sleep.Task.Delay在Timer内部使用,因此它不会阻塞任何线程,但是启动一个新的Task来Thread.Sleep阻塞线程(通常是Threadpool线程).
在你的例子中,你从未开始过Task.创建Taskwith构造函数将返回Unstarted需要通过调用Start方法启动的任务.否则它永远不会完成(因为你从未开始它).
但是Task.Start不鼓励打电话,你可以打电话Task.Factory.StartNew(()=> Thread.Sleep(1000))或者Task.Run(()=> Thread.Sleep(1000))如果你想浪费资源.
此外,要知道,StartNew是危险的,你应该更喜欢Task.Run过StartNew,除非有令人信服的理由这样做.