C#多线程Thread类的使用(二)

前面的篇章介绍了多线程的基本概念和基本使用,下面介绍怎样处理带有回调功能的多线程。所谓回调就是执行完成后调用一些方法做最后的处理。例如我们想要在多线程执行完成后调用方法来表达多线程执行完毕。

一、封装带有回调函数的线程

#region  //封装带有回调函数的线程
private void ThreadWithCallBack(ThreadStart threadStart, Action actionCallback)  //自定义带回调的多线程调用方法
{
    ThreadStart threadstart2 = () =>      //Invoke()方法表示的是委托同步调用
    {
        threadStart.Invoke();         //先调用
        actionCallback.Invoke();      //后调用,如此便可以保证回调委托必定在多线程委托后执行
    };
    Thread newthread=new Thread(threadstart2);  //开启新线程,执行threadstart2中的方法。
    newthread.Start();                    //线程开始
}

private void button3_Click(object sender, EventArgs e)
{
    Action myCallBack = () => Console.WriteLine("回调方法调用结束");  //声明和定义回调委托

    ThreadStart threadstart = () =>                            //声明和定义线程委托,
    {
        this.doSomething1("方法1");                          //多线程待调用方法1
        this.doSomething2("方法2");                          //多线程待调用方法2
    };
    ThreadWithCallBack(threadstart,myCallBack);             //多线程调用带回调

    Console.WriteLine("多线程带回调方法调用结束");          
}
#endregion

上述代码执行的结果为:
在这里插入图片描述
由上述代码执行的结果可以看出,由于线程的作用,主线程没有阻塞,所以首先输出“多线程带回调方法调用结束”。然后按照ThreadStart委托对象中待调用方法顺序逐次调用,先调用doSomething1,后调用doSomething2。两个方法调用完毕后才调用最后的回调委托的方法,输出“回调方法调用结束”

二、调用带回调和返回值的方法

#region   //调用带回调和返回值的方法
private int dodo()    //先定义一个带有返回值的方法
{
    ParameterizedThreadStart threadStart = a =>   //有参的要用ParamterizedThreadStart委托
    {
        this.doSomething1((string)a);
    };
    Thread newThread = new Thread(threadStart);
    newThread.Start("带有返回值的多线程演示");     //新线程开始,并将参数传入
    return 100;                                  //返回值
}

private Func<T> ThreadWithResult<T>(Func<T> func)   //封装一个带有返回值的方法,用于处理有返回值类型的方式
{
    T t=default(T);

    ThreadStart threadStart = ()=>t=func.Invoke();
    Thread thread = new Thread(threadStart);
    thread.Start();

    return new Func<T>(() =>  //下面的两个语句不会立即处理,而是被包含在Lambda表达式的委托中返回出去,由被调函数执行
    {
        thread.Join();  
        return t;
    });

}

private void button4_Click(object sender, EventArgs e)
{
    Func<int> myFunc = () => dodo();

    Func<int> Iresult = ThreadWithResult(myFunc);

    Console.WriteLine("执行结束");

    Console.WriteLine("最终结果值为:"+Iresult.Invoke()); 
}
#endregion

在这里插入图片描述
由上面执行的结果我们可以看出来,由于多线程的作用,最先输出的为“执行结束”。然后由于无阻塞作用,直接输出“最终结果值为:100”。接着dodo开启的线程执行完成doSomething1.输出“用:带有返回值的多线程演示在11线程中执行方法1”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值