1. 程式人生 > >使用C#多執行緒提高系統響應能力舉例

使用C#多執行緒提高系統響應能力舉例

業務需求

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();