C#线程使用详解

1.使用委托发起线程

基本的操作,使用线程获取方法返回值的第一种方式

 static int Test(int i,string str)
        {
            Console.WriteLine("test"+i+str);
            Thread.Sleep(100);//让当亲线程休眠(暂停线程的执行) 单位ms
            return 100;
        }
            //将Test方法赋值给委托变量a
            Func<int, string, int> a = Test;

            // 开启一个新的线程去执行 委托a所引用的方法 
            //IAsyncResult 可以取得当前线程的状态
            IAsyncResult ar = a.BeginInvoke(100, "siki", null, null);
            //可以认为线程是同时执行的(异步执行)
            Console.WriteLine("main");
            while (ar.IsCompleted == false)//如果当前线程没有执行完毕
            {
                Console.Write(".");
                Thread.Sleep(10); //控制子线程的检测频率
            }
            //取得异步线程的返回值
            int res = a.EndInvoke(ar);
            Console.WriteLine(res);

获取委托方法返回值的第二种方式,直接等待执行该方法的线程结束再获取函数返回值。

    bool isEnd = ar.AsyncWaitHandle.WaitOne(1000);
//1000毫秒表示超时时间,如果等待了1000毫秒 线程还没有结束的话 那
//么这个方法会返回false 如果在1000毫秒以内线程结束了,那么这个方法会返回true
     if (isEnd)
        {
          int res = a.EndInvoke(ar);
          Console.WriteLine(res);
        }

获取值的第三种方式,采用回调函数


//通过回调 检测线程结束
Func<int, string, int> a = Test;
//倒数第二个参数是一个委托类型的参数,表示回调函数,就是当线程结束的时候会调用这个委托指向的方法 
//倒数第一个参数用来给回调函数传递数据
// 开启一个新的线程去执行 a所引用的方法 
a.BeginInvoke(100, "siki", ar =>
{
    int res = a.EndInvoke(ar);
    Console.WriteLine(res+"在lambda表达式中取得");
}, null);

Console.ReadKey();

获取值第四种方式

        static void OnCallBack(IAsyncResult ar1)
        {
            Func<int, string, int> a = ar1.AsyncState as Func<int, string, int>;
            int res = a.EndInvoke(ar1);
            Console.WriteLine(res + "在回调函数中取得结果");
        }
            Func<int, string, int> a = Test;
            IAsyncResult ar = a.BeginInvoke(100, "siki", OnCallBack, a);
            Console.ReadKey();

2.使用Thread类线程

1.该种线程执行方法,方法传入的参数需要声明为object类

public void DownloadFile(object filename)
{
    string s = filename as string;
    Console.WriteLine(s);
}
Thread t = new Thread(DownloadFile);//创建出来Thread对象,这个线程并没有启动
t.Start("xxx.种子");//开始,开始去执行线程,传入参数
t.Abort();//终止这个线程的执行

2.将方法放在类中,实例化类的时候将参数传入方法,然后调用类的方法,开启线程

    class MyThread
    {
        private string filename;
        private string filepath;

        public MyThread(string fileName, string filePath)
        {
            this.filename = fileName;
            this.filepath = filePath;
        }

        public void DownFile()
        {
            Console.WriteLine("开始下载"+filepath+filename);
            Thread.Sleep(2000);
            Console.WriteLine("下载完成");
        }

    }

    MyThread my = new MyThread("xxx.bt", "http://www.xxx.bbs");
    Thread t = new Thread(my.DownFile);//我们构造一个thread对象的时候,可以传递一个静态方法,也可以传递一个对象的普通方法
    t.Start();

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪猪派对

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值