1. 程式人生 > 程式設計 >C#程式執行時間長查詢速度慢解決方案

C#程式執行時間長查詢速度慢解決方案

一,程式執行慢導致的原因就是查詢資料庫慢.,導致返回值慢,那這個要怎麼解決呢?

1,優化資料庫查詢如這個文章 C#匯出資料到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》結果需要排序,因為並行執行緒的結果是亂序的

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。