1. 程式人生 > 實用技巧 >.netcore 使用多執行緒Task消費佇列進行消費

.netcore 使用多執行緒Task消費佇列進行消費

  WebApiResult為封裝公用方法,不是微軟自帶,此段程式碼指是做畫龍點睛作用,新增佇列、非同步消費等

  public async Task AuthentDeal()
        {
            //從資料庫查詢要處理的佇列
            var batchList = _MySqlMasterDb.tab1.Where(p => p.is_certifi == -1).ToList();
            if (batchList.Count <= 0)
            {
                return;
            }

            Dictionary
<Guid, WebApiResult> resultList = new Dictionary<Guid, WebApiResult>(); //將查詢物件放入佇列 ConcurrentQueue<tab1> searchQueue = new ConcurrentQueue<tab1>(); foreach (var item in batchList) { searchQueue.Enqueue(item); }
//設定執行緒數量 int threadCount = searchQueue.Count < Environment.ProcessorCount ? searchQueue.Count : Environment.ProcessorCount; Task[] tasks = new Task[threadCount]; for (int i = 0; i < threadCount; i++) { tasks[i] = Task.Run(() => { WebApiResult taskResult
= new WebApiResult(); while (searchQueue.TryDequeue(out partners t)) { taskResult = VerifyPartners(t).Result;//驗證方法 if (taskResult != null) { resultList.Add(t.id, taskResult);//驗證結果存入字典中 } } return taskResult; }); } Task.WaitAll(tasks); foreach (var item in batchList) { if (resultList.ContainsKey(item.id)) { var verifyResult = resultList[item.id]; var authResult = JsonConvert.DeserializeObject<Tuple<bool, List<CertificateErrorType>, TencentBankQueryResult, string, bool>>(JsonConvert.SerializeObject(verifyResult.Data)); //驗證完成後業務處理 // // } } }