如何等待一个线程执行完毕后再执行下面的代码?

howze 2018-12-12 10:17:49
实际业务中需要等待一个线程结束并拿到结果后再执行后面的程序,我试过一些方法都不行,请各位大神帮忙看看错在哪里。


///点击按钮后,启动线程,调用执行函数test()
private void btn_Click(object sender, EventArgs e)
{

Thread th = new Thread(test);
th.IsBackground = true;
th.Start();
th.Join();///我用了join方法,结果程序就卡死了

MessageBox.Show("线程执行完毕", "提示");

}


public void test()
{
while (flag)//flag是一个循环开关,判断是否结束循环
{
if (满足条件)
{
flag = false;
}

Thread.Sleep(3000);
}
}


希望等线程test方法执行完毕后,在执行MessageBox.Show("线程执行完毕", "提示");
但实际上发现不行,我尝试了join方法,结果程序就卡死了。
请问这种情况该怎么处理,谢谢!
...全文
4679 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
YYCQSDN 2021-10-26
  • 打赏
  • 举报
回复

var task = Task.Factory.StartNew(() => {});
task.Wait();

  • 打赏
  • 举报
回复
调用加不加括号我一时半会想不起来了你都试试就行。
  • 打赏
  • 举报
回复

//另外说一下如果需要返回
public async Task<object> test()
{
//todo
return new object;
}
//直接使用
object o= test.result;
//await使用
object o=await test;
  • 打赏
  • 举报
回复
引用 5 楼 howze 的回复:
[quote=引用 3 楼 xomix 的回复:] [quote=引用 2 楼 howze 的回复:] [quote=引用 1 楼 娃都会打酱油了 的回复:]
var task = Task.Run(()=> { });
task.ContinueWith
听说现在流行用task了,但是我不会啊,程序里都是用的thread,有没有用thread能解决的呀,谢谢了[/quote]

//等于在方法内写匿名方法实现你的线程调用方法,并且使用了等待。
await Task.Run(async ()=>{
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }
 
                Thread.Sleep(3000);
            }
});

//拆分成方法
        public async Task test()
        {
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }
                Thread.Sleep(3000);
            }
        }
 //调用
await test();
[/quote] 谢谢您的解答,那我总结一下,是这样用吗?不好意思,从没用过task,见谅。


        ///点击按钮后,启动线程,调用执行函数test()
        private void btn_Click(object sender, EventArgs e)
        {

                    await test();

                    MessageBox.Show("线程执行完毕", "提示");

        }


        public async Task test()
        {
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }

                Thread.Sleep(3000);
            }
        }

[/quote] 是的,手敲代码可能有一些typo,你在ide里面自己修正一下就行了。
howze 2018-12-12
  • 打赏
  • 举报
回复
引用 3 楼 xomix 的回复:
[quote=引用 2 楼 howze 的回复:] [quote=引用 1 楼 娃都会打酱油了 的回复:]
var task = Task.Run(()=> { });
task.ContinueWith
听说现在流行用task了,但是我不会啊,程序里都是用的thread,有没有用thread能解决的呀,谢谢了[/quote]

//等于在方法内写匿名方法实现你的线程调用方法,并且使用了等待。
await Task.Run(async ()=>{
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }
 
                Thread.Sleep(3000);
            }
});

//拆分成方法
        public async Task test()
        {
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }
                Thread.Sleep(3000);
            }
        }
 //调用
await test();
[/quote] 谢谢您的解答,那我总结一下,是这样用吗?不好意思,从没用过task,见谅。


        ///点击按钮后,启动线程,调用执行函数test()
        private void btn_Click(object sender, EventArgs e)
        {

                    await test();

                    MessageBox.Show("线程执行完毕", "提示");

        }


        public async Task test()
        {
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }

                Thread.Sleep(3000);
            }
        }

assky124 2018-12-12
  • 打赏
  • 举报
回复
Task 就是对线程的封装,原理是一样的,不过用起来更方便而已。 你也可以在线程执行完,放个回调
  • 打赏
  • 举报
回复
引用 2 楼 howze 的回复:
[quote=引用 1 楼 娃都会打酱油了 的回复:]
var task = Task.Run(()=> { });
task.ContinueWith
听说现在流行用task了,但是我不会啊,程序里都是用的thread,有没有用thread能解决的呀,谢谢了[/quote]

//等于在方法内写匿名方法实现你的线程调用方法,并且使用了等待。
await Task.Run(async ()=>{
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }
 
                Thread.Sleep(3000);
            }
});

//拆分成方法
        public async Task test()
        {
            while (flag)//flag是一个循环开关,判断是否结束循环
            {
                if (满足条件)
                {
                    flag = false;
                }
                Thread.Sleep(3000);
            }
        }
 //调用
await test();
howze 2018-12-12
  • 打赏
  • 举报
回复
引用 1 楼 娃都会打酱油了 的回复:
var task = Task.Run(()=> { });
task.ContinueWith
听说现在流行用task了,但是我不会啊,程序里都是用的thread,有没有用thread能解决的呀,谢谢了
  • 打赏
  • 举报
回复
var task = Task.Run(()=> { });
task.ContinueWith
howze 2018-12-12
  • 打赏
  • 举报
回复
引用 13 楼 xomix 的回复:
[quote=引用 12 楼 howze 的回复:] [quote=引用 8 楼 xomix 的回复:] 调用加不加括号我一时半会想不起来了你都试试就行。
而且我的test()方法里面还要操作界面UI,使用wait以后,主界面直接卡死了[/quote]操作UI不要随便用多线程或后台任务,否则卡死很常见,耗时操作用这些东西,更新ui的东西通过这些操作来做,直接都揉在一起不行。 https://blog.csdn.net/wpwalter/article/details/78370706 具体参见这篇文章[/quote] 这篇文章看完就明白了,感谢!
  • 打赏
  • 举报
回复
引用 12 楼 howze 的回复:
[quote=引用 8 楼 xomix 的回复:] 调用加不加括号我一时半会想不起来了你都试试就行。
而且我的test()方法里面还要操作界面UI,使用wait以后,主界面直接卡死了[/quote]操作UI不要随便用多线程或后台任务,否则卡死很常见,耗时操作用这些东西,更新ui的东西通过这些操作来做,直接都揉在一起不行。 https://blog.csdn.net/wpwalter/article/details/78370706 具体参见这篇文章
howze 2018-12-12
  • 打赏
  • 举报
回复
引用 8 楼 xomix 的回复:
调用加不加括号我一时半会想不起来了你都试试就行。
而且我的test()方法里面还要操作界面UI,使用wait以后,主界面直接卡死了
  • 打赏
  • 举报
回复
private async void btn_Click(object sender, EventArgs e)
  • 打赏
  • 举报
回复
引用 9 楼 howze 的回复:
[quote=引用 8 楼 xomix 的回复:] 调用加不加括号我一时半会想不起来了你都试试就行。
大神,还是不行

        ///点击按钮后,启动线程,调用执行函数test()
        private void btn_Click(object sender, EventArgs e)
        {

                    await test();

                    MessageBox.Show("线程执行完毕", "提示");

        }
awati无法用在btn_Click事件里面[/quote]

private async void btn_Click(object sender, EventArgs e)
howze 2018-12-12
  • 打赏
  • 举报
回复
引用 8 楼 xomix 的回复:
调用加不加括号我一时半会想不起来了你都试试就行。
大神,还是不行

        ///点击按钮后,启动线程,调用执行函数test()
        private void btn_Click(object sender, EventArgs e)
        {

                    await test();

                    MessageBox.Show("线程执行完毕", "提示");

        }
awati无法用在btn_Click事件里面

110,535

社区成员

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

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

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