使用C#多线程提高系统响应能力举例

来源:互联网 发布:淘宝一件代发发货 编辑:程序博客网 时间:2024/06/04 18:33

业务需求

1.当后端接口接受用户请求的时候,可能需要保存到多个地方(可能去写缓存,去入实体库)。

假设从Client接受到data 需要保存到DB1,DB2,DB3

保存时间:DB1>DB2>DB3

下面举个例子

假设保存DB1失败,DB2成功,DB3成功。当程序检测到有任何一个保存成功的时候,就立马提示用户保存成功,提高系统反应速度。

   Console.WriteLine("开始接收到数据……");
            object obj = new object();//加锁对象
            bool reslut = false;//添加标识
            Task<bool> t1 = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("保存到DB1");
                if (!reslut)//只有reslut = false才执行,防止标识被覆盖
                {
                    lock (obj)
                    {
                        reslut = false;//假设保存到DB1失败
                    }
                }
            
                return reslut;
            });
            Task<bool> t2 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(100);
                Console.WriteLine("保存到DB2");
                if (!reslut)//只有reslut = false才执行,防止标识被覆盖
                {
                    lock (obj)
                    {
                        reslut = true;//假设保存到DB2成功
                    }
                }
       
                return reslut;
            });
            Task<bool> t3 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(200);
                Console.WriteLine("保存到DB3");
                if (!reslut)//只有reslut = false才执行,防止标识被覆盖
                {
                    lock (obj)
                    {
                        reslut = true;//假设保存到DB3成功
                    }
                }
                return reslut;
            });
            while (!reslut)
            {
                if (t1.IsCompleted&&t2.IsCompleted&& t3.IsCompleted)
                {
                    break;
                }
                Thread.Sleep(2);
            }
            if (reslut)
            {
                Console.WriteLine("保存成功");//这时就可以提示用户保存成功
            }
            else
            {
                Console.WriteLine("保存失败");
            }
            Console.ReadKey();