Thread 多线程 等待 回调函数 获取返回值

Thread 是1.1版本时候的线程 它默认是前台线程

前台线程:进程关闭后,线程还会执行完


无参数多线程

 Console.WriteLine("主线程开始");
            //不带参数的多线程

            ThreadStart sta = () =>
            {
                Thread.Sleep(500);
                Console.WriteLine("线程{0}开始执行方法",Thread.CurrentThread.ManagedThreadId);
            };
            //创建Thread

          
            //实现多线程
            for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(sta);
                t.Start();
               
            }
          

            Console.WriteLine("主线程结束");

结果



有参数 多线程

Console.WriteLine("主线程开始");
            //带参数多线程

            ParameterizedThreadStart p = t => 
            {
                Thread.Sleep(1000);
                Console.WriteLine("参数为{0},当前线程为{1}",t,Thread.CurrentThread.ManagedThreadId);
            };

            for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(p);
                t.Start(i);
            }
            Console.WriteLine("主线程结束");

结果



回调函数

 public static void Do3()
        {
            //Thread实现添加回调函数
            //在我看来这就是伪回调
            //正经的回调函数是如果有等待线程的话,等待只会等着方法体完成就算等待完成,而不会等待回调函数完成
            //这种实现方法 会把回调函数也等待完成
            Console.WriteLine("主线程开始");
            ThreadStart sta = () => 
            {
                FirstFun();
                CallBackFun();
            };

            List<Thread> tList = new List<Thread>();


            for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(sta);
                t.Start();
                tList.Add(t);//加入集合中 方便等待
            }

            //等待

            foreach (Thread t in tList)
            {
                //此效果就是将线程加入主线程当中  起到等待效果
                t.Join();
            }

            Console.WriteLine("主线程结束");
            Console.Read();
        }

        //委托方法
        public static void FirstFun()
        {
            Thread.Sleep(1000);
            Console.WriteLine("这里是主方法体内容,当前线程ID{0}",Thread.CurrentThread.ManagedThreadId);
        }
        //回调函数
        public static void CallBackFun()
        {
            Thread.Sleep(1000);
            Console.WriteLine("这里是回调函数内容,当前线程ID{0}", Thread.CurrentThread.ManagedThreadId);
        }

调用Do3的结果


有回调函数 有返回值

 public static void Do4()
        { 
            //带参数带返回值
            
            ParameterizedThreadStart p = t =>
            {
                string Rvalue = null;           
                Rvalue=FirstFun1((int)t);
                CallBackFun1();
                Console.WriteLine("结果{0}",Rvalue);
            };

            for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(p);
                t.Start(i);
            }
        
        }

        //委托方法
        public static string FirstFun1(int i)
        {
            Thread.Sleep(1000);
            Console.WriteLine("这里是主方法体内容,当前线程ID{0}", Thread.CurrentThread.ManagedThreadId);
            return i.ToString();
        }
        //回调函数
        public static void CallBackFun1()
        {
            Thread.Sleep(1000);
            Console.WriteLine("这里是回调函数内容,当前线程ID{0}", Thread.CurrentThread.ManagedThreadId);
        }


结果




等待

ThreadStart sta = () => 
            {
                FirstFun();
                CallBackFun();
            };

            List<Thread> tList = new List<Thread>();


            for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(sta);
                t.Start();
                tList.Add(t);//加入集合中 方便等待
            }

            //等待

            foreach (Thread t in tList)
            {
                //此效果就是将线程加入主线程当中  起到等待效果
                t.Join();
            }



  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中,多线程异步回调函数可以通过使用 std::thread 和 std::async 实现。 std::thread 是 C++11 中引入的一个线程库,它可以创建一个新的线程来执行函数。例如,以下代码创建了一个新线程并执行了一个函数: ``` void myFunction() { // 执行一些操作 } int main() { std::thread t(myFunction); t.join(); // 等待线程执行完毕 return 0; } ``` std::async 也是 C++11 中引入的另一个库,它可以异步地执行一个函数返回一个 std::future 对象,该对象可以用于获取异步函数返回。例如,以下代码使用 std::async 异步地执行一个函数: ``` int myFunction() { // 执行一些操作 return 42; } int main() { std::future<int> result = std::async(std::launch::async, myFunction); // 执行一些其他操作 int value = result.get(); // 等待异步函数执行完毕并获取返回 return 0; } ``` 在多线程中使用异步回调函数时,可以将回调函数作为参数传递给异步函数,在异步函数完成后调用回调函数。例如,以下代码异步执行一个函数并在完成后调用回调函数: ``` void myCallback(int result) { // 处理异步函数的结果 } void myFunction(std::function<void(int)> callback) { // 执行一些操作 int result = 42; callback(result); // 调用回调函数 } int main() { std::function<void(int)> callback = myCallback; std::async(std::launch::async, myFunction, callback); // 执行一些其他操作 return 0; } ``` 在上面的代码中,myFunction 接受一个 std::function 对象作为回调函数,并在异步执行完毕后调用该函数。在 main 函数中,我们创建了一个 std::function 对象并将其传递给异步函数。在异步函数执行完毕后,myCallback 函数将被调用,并传递异步函数的结果作为参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值