C#程序執行時間長和慢查詢解決: 線程並行實現處理


 一,程序執行慢導致的原因就是查詢數據庫慢.,導致返回值慢,那這個要怎么解決呢?

1,優化數據庫查詢如這個文章,導出大量數據到excel,怎么提升性能

2,使用線程並行查詢,然后合並成一個集合,代碼如下,必須留意備注的核心點

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace TestConsoleApp
{
    /// <summary>
    ///C#慢查詢解決: 線程並行實現處理
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            List<Task> taskList = new List<Task>();
            int count = 100;
            int batch = count % 10;
            object lockObj = new object();
            List<int> list = new List<int>();

            ///開啟線程並行執行
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = 0; i < batch; i++)
            {
                taskList.Add(Task.Run(() =>
                {
                    for (int j = count * i; j < count * (i + 1); j++)
                    {
                        ///休眠等待,模擬慢查詢需要消耗的時間
                        Thread.Sleep(100);
                        ///核心邏輯:避免線程插入沖突
                        lock (lockObj)
                        {
                            list.Add(i);
                        }
                    }
                }));
            }
            ///這里核心是等待所有的線程結束,然后再執行下去
            Task.WaitAll(taskList.ToArray());
            ///這里再內存處理排序,避免返回的結果跟正常查詢出來的結果排序不一致
            list = list.OrderByDescending(u => u).ToList();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);


            Console.WriteLine("**********分割線***********");

            ///原始遍歷實現
            List<int> list2 = new List<int>();
            Stopwatch stopwatch2 = new Stopwatch();
            stopwatch2.Start();
            for (int i = 0; i < count; i++)
            {
                ///休眠等待,模擬慢查詢需要消耗的時間
                Thread.Sleep(100);
                list2.Add(i);
            }
            Console.WriteLine(stopwatch2.ElapsedMilliseconds);
            Console.ReadLine();
        }
    }
}

PS:核心點

1》線程等待線程結束Task.WaitAll

2》鎖住集合,以防插入占用導致報錯

3》結果需要排序,因為並行線程的結果是亂序的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM