文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#怎么实现多线程编程

2023-06-30 04:51

关注

本文小编为大家详细介绍“C#怎么实现多线程编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现多线程编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、使用线程的理由

可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。
2、可以使用线程来简化编码。
3、可以使用线程来实现并发执行。

二、基本知识

进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。
2、前台线程和后台线程:通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
3、挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。
4、阻塞线程:Join,阻塞调用线程,直到该线程终止。
5、终止线程:Abort:抛出 ThreadAbortException 异常让线程终止,终止后的线程不可唤醒。Interrupt:抛出 ThreadInterruptException 异常让线程终止,通过捕获异常可以继续执行。
6、线程优先级:Highest AboveNormal Normal BelowNormal Lowest ,默认为Normal。

三、线程的使用

线程函数通过委托传递,可以不带参数,也可以带参数(只能有一个参数),可以用一个类或结构体封装参数。

案例:

class Program    {        static void Main(string[] args)        {            Thread t1 = new Thread(new ThreadStart(TestMethod));//创建无参数数线程            Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod));//创建带参数的线程            //设置为后台进程            t1.IsBackground = true;            t2.IsBackground = true;            t1.Start();            t2.Start("hello");            Console.ReadKey();        }        public static void TestMethod()        {            Console.WriteLine("不带参数的线程函数");        }        //参数要定义为object 类型        public static void TestMethod(object data)        {            string datastr = data as string;            Console.WriteLine("带参数的线程函数,参数为:{0}", datastr);        }    }

四、线程池

由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成内存资源的浪费,出于对性能的考虑,于是引入了线程池的概念。线程池维护一个请求队列,线程池的代码从队列提取任务,然后委派给线程池的一个线程执行,线程执行完不会被立即销毁,这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。
线程池线程默认为后台线程(IsBackground)。

class Program    {        static void Main(string[] args)        {            //将工作项加入到线程池队列中,这里可以传递一个线程参数            ThreadPool.QueueUserWorkItem(TestMethod, "Hello");            Console.ReadKey();        }        //线程函数        public static void TestMethod(object data)        {            string datastr = data as string;            Console.WriteLine(datastr);        }    }

五、Task类

使用ThreadPool的QueueUserWorkItem()方法发起一次异步的线程执行很简单,但是该方法最大的问题是没有一个内建的机制让你知道操作什么时候完成,有没有一个内建的机制在操作完成后获得一个返回值。为此,可以使用System.Threading.Tasks中的Task类。
构造一个Task<TResult>对象,并为泛型TResult参数传递一个操作的返回类型。

class Program    {        static void Main(string[] args)        {            Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000);            t.Start();            t.Wait();            Console.WriteLine(t.Result);            Console.ReadKey();        }        private static Int32 Sum(Int32 n)        {            Int32 sum = 0;            for (; n > 0; --n)                checked{ sum += n;} //结果太大,抛出异常            return sum;        }    }

一个任务完成时,自动启动一个新任务。
一个任务完成后,它可以启动另一个任务,下面重写了前面的代码,不阻塞任何线程。

class Program    {        static void Main(string[] args)        {            Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000);            t.Start();            //t.Wait();            Task cwt = t.ContinueWith(task => Console.WriteLine("The result is {0}", t.Result));            Console.ReadKey();        }        private static Int32 Sum(Int32 n)        {            Int32 sum = 0;            for (; n > 0; --n)                checked { sum += n; } //结果溢出,抛出异常            return sum;        }    }

六、委托异步执行

委托的异步调用:BeginInvoke() 和 EndInvoke()

namespace Test{    public delegate string MyDelegate(object data);    class Program    {        static void Main(string[] args)        {            MyDelegate mydelegate = new MyDelegate(TestMethod);            IAsyncResult result = mydelegate.BeginInvoke("Thread Param", TestCallback, "Callback Param");            //异步执行完成            string resultstr = mydelegate.EndInvoke(result);        }        //线程函数        public static string TestMethod(object data)        {            string datastr = data as string;            Console.WriteLine(datastr);            return datastr;        }        //异步回调函数        public static void TestCallback(IAsyncResult data)        {            Console.WriteLine(data.AsyncState);        }    }}

异步回调函数在上面线程函数执行结束后,将要退出时执行。

读到这里,这篇“C#怎么实现多线程编程”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯