C# Task.Wait如何使用才不会卡死界面?

博客园铁粉 2016-12-07 06:26:46
Task t = Task.Run( () => {
Thread.Sleep(5000);
} );
t.Wait();
这句为什么会导致界面卡死呢?应该怎么写?
...全文
6334 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeMotion 2021-01-14
  • 打赏
  • 举报
回复 1
Task t 不在UI线程中,但是t.wait(),是在UI线程中等待的。这是造成UI卡顿的原因;
await Task.Run(() =>
{
Thread.Sleep(5000);
});
Finish();
这里的 await 后面的代码本身就是在其他线程里执行的,所以UI线程不会阻塞。等待
5秒后运行UI线程的其他任务Finish()。
qq_35345112 2019-06-20
  • 打赏
  • 举报
回复
如果要取task结果 也可使用委托 任务结束后通知主线程
qq_35345112 2019-06-20
  • 打赏
  • 举报
回复
如果不要等到任务结果的话,就不用让他wait。wait后他就会阻塞当前线程 直到task处理完毕
Fxxk_Csdn 2019-05-28
  • 打赏
  • 举报
回复 1
talk is cheap ,show me the code. else, FUCK U
m0_37187646 2019-04-03
  • 打赏
  • 举报
回复
while (true) { Application.DoEvents(); } 这个可能是你想要的东西
「已注销」 2018-03-13
  • 打赏
  • 举报
回复 2
引用 1 楼 sp1234 的回复:
Task 还要 Sleep 还要 Wait,你这不是明显自相矛盾吗。
看到这种回复特别的反感,我也是新手,今天为Task.wait感到困惑百度而来,人家就是因为不太了解才来问,你TMD还反过来以指责的口吻反过来问,既然你不想来帮人解决问题就别BB了,想想你当年还是菜鸟的时候吧......
z879659338 2017-12-27
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e) { Task tasktest = new Task(new Action(() => { for (int i = 0; i < 100000; i++) { string a = i.ToString(); this.BeginInvoke(new Action(() => { this.richTextBox1.AppendText(a + "||"); //将光标位置设置到当前内容的末尾 richTextBox1.SelectionStart = richTextBox1.Text.Length; //滚动到光标位置 richTextBox1.ScrollToCaret(); })); Thread.Sleep(100); } })); tasktest.Start(); }
z879659338 2017-12-27
  • 打赏
  • 举报
回复
首先,看到这个“sp1234”发言就很烦人 先说一下这个问题啊,你走一个事件,是通过UI线程,然后你走了Wait(),导致UI线程在等待状态,所以你wait()之后界面当然卡主,但是不是卡死,UI界面在等待状态,但是你task是修改UI,当前UI还是在等待状态,然后现在都不动了 至于你想达到的效果,就是都放到一个线程里,上面也有人说这事,今天才看到,但是看到有些人说的话,就是想说说而已
小码戈 2017-05-17
  • 打赏
  • 举报
回复
        private async void Form1_Load(object sender, EventArgs e)
        {
            string msg = string.Empty; 
            msg = await asyncFunc();
            MessageBox.Show(msg);
        }

        public Task<string> asyncFunc()
        {
            var t = Task.Run(() =>
            {
                Thread.Sleep(5000);

                return "test";
            });
            return t;
        }
可以写为:
     

        private void Form1_Load(object sender, EventArgs e)
        {
            string msg = string.Empty;
            Task<string> t = asyncFunc();
            Task t2 = Task.Run(() =>
            {
                msg = t.Result;

                MessageBox.Show(msg);
            });
        }
        public Task<string> asyncFunc()
        {
            var t = Task.Run(() =>
            {
                Thread.Sleep(5000);

                return "test";
            });
            return t;
        }
编程有钱人了 2016-12-09
  • 打赏
  • 举报
回复
直接 Task.Run( () => { //直接写你的逻辑,不用sleep 就不卡了 } );
博客园铁粉 2016-12-08
  • 打赏
  • 举报
回复
引用 9 楼 starfd 的回复:
wait就是阻塞当前前程直到该task运行结束…… 如果你是在这之后要做其他事情,可以通过task.ContinueWith来执行后续方法
continuewith我知道,应该是类似回掉委托吧? 我是想要在耗时操作执行完之前代码卡在这里同时界面不卡死,但是用continuewith的话代码就会继续往下执行了。
  • 打赏
  • 举报
回复
wait就是阻塞当前前程直到该task运行结束…… 如果你是在这之后要做其他事情,可以通过task.ContinueWith来执行后续方法
博客园铁粉 2016-12-08
  • 打赏
  • 举报
回复
引用 5 楼 hanjun0612 的回复:
为何要 t.Wait();???
因为我不想让Task执行的同时代码就继续往下执行了,而是在Task执行完之后才继续往下执行。
博客园铁粉 2016-12-08
  • 打赏
  • 举报
回复 1
引用 4 楼 duanzi_peng 的回复:
Sleep 是不对的。不清楚你要做什么
Sleep是我模拟的耗时操作,目的是想用Wait而不是await的写法,让代码在执行完耗时操作之后才继续执行,同时界面不能卡死。 类似下面这个: Task t = Task.Run( () => {                           耗时操作();                          } );      awiat t; 继续往下执行();
博客园铁粉 2016-12-08
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
Task 还要 Sleep 还要 Wait,你这不是明显自相矛盾吗。
我的意思是Task里面模拟一个耗时操作,然后在执行耗时操作的同时保证界面不卡死,并且要等待操作执行完之后才继续往下执行。 类似下面这个: Task t = Task.Run( () => {                           耗时操作();                          } );      awiat t; 继续往下执行(); 也就是说,我的目的是:代码在耗时操作执行完之前会卡在“继续往下执行()”这个方法前,并且界面不能卡死。
正怒月神 2016-12-08
  • 打赏
  • 举报
回复
为何要 t.Wait();???
exception92 2016-12-08
  • 打赏
  • 举报
回复
Sleep 是不对的。不清楚你要做什么
博客园铁粉 2016-12-08
  • 打赏
  • 举报
回复
引用 33 楼 knf 的回复:
下载个Microsoft.Bcl.Async库,4.0也可以用async/await了,何必自己去折腾呢
只是想了解一下写法
博客园铁粉 2016-12-08
  • 打赏
  • 举报
回复
引用 32 楼 starfd 的回复:
他就是将后续所有的代码封装到Task(包括参数)里,然后再ContinueWith执行
我想用Task的方式实现  await Task.Run(() =>     {         Thread.Sleep(5000);     });    Finish(); 这种既不会卡死界面,代码也会在FInish()之前停顿5秒的效果,请问应该怎么做?
knf 2016-12-08
  • 打赏
  • 举报
回复
下载个Microsoft.Bcl.Async库,4.0也可以用async/await了,何必自己去折腾呢
加载更多回复(25)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧