第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

使用 Dapper 并行執(zhí)行多個(gè)查詢

使用 Dapper 并行執(zhí)行多個(gè)查詢

C#
HUX布斯 2023-08-20 15:28:59
我嘗試使用 Dapper 和存儲過程并行執(zhí)行三個(gè)相似的 SQL 查詢,以在所有查詢完成后獲得三個(gè)相似的結(jié)果。這是我的代碼:public class SomeReport{    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["SomeContext"].ToString();    public ReportStatus ReportStatus { get; set; }    public long NetworkServerTime { get; set; }    public string ReportLastErrorMessage { get; set; }    public RowSet[] FirstRowSet { get; set; }    public RowSet[] SecondRowSet { get; set; }    public RowSet[] ThirdRowSet { get; set; }    public Report()    {        NetworkServerTime = 0;        ReportStatus = ReportStatus.NotCreated;    }    public async Task GetReportDataAsync(ReportParameters parameters)    {        DynamicParameters requestParameters = new DynamicParameters();        requestParameters.Add("@sinceDateFilter", parameters.SinceDate?.Date, DbType.DateTime);        requestParameters.Add("@untilDateFilter", parameters.UntilDate?.Date, DbType.DateTime);        requestParameters.Add("@countryId", parameters.CountryId, DbType.Int32);        ReportLastErrorMessage = null;        Task allTasks = null;        var stopWatch = new Stopwatch();        try        {            var firstTask = GetRows("[dbo].[GET_Report_FirstRowSet]", requestParameters);            var secondTask =                GetRows("[dbo].[GET_Report_SecondRowSet]", requestParameters);            var thirdTask =                GetRows("[dbo].[GET_Report_ThirdRowSet]", requestParameters);            allTasks = Task.WhenAll(firstTask, secondTask, thirdTask);            FirstRowSet = await firstTask;            SecondRowSet = await secondTask;            ThirdRowSet = await thirdTask;        }        catch (Exception ex)        {            ReportStatus = ReportStatus.Error;            ReportLastErrorMessage = allTasks?.Exception?.InnerExceptions.Last().Message;        }但是,當(dāng)我啟動調(diào)試器和 SQL Server Profiler 時(shí),我發(fā)現(xiàn)在創(chuàng)建與其對應(yīng)的任務(wù)時(shí),查詢是按順序執(zhí)行的。如何使查詢同時(shí)開始運(yùn)行并并行運(yùn)行?
查看完整描述

2 回答

?
慕碼人8056858

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊

如果我使用調(diào)試器和 sql-profiler,我會看到探查器中的第一個(gè)查詢是在我位于代碼行時(shí)執(zhí)行的,var firstTask = GetRows("[dbo].[GET_Report_FirstRowSet]", requestParameters);但不是在我位于代碼行時(shí)執(zhí)行的allTasks = Task.WhenAll (firstTask, secondTask, thirdTask);

這是正確且正常的。async/ 的工作方式await是,一旦發(fā)生第一個(gè)不完整的await情況,控制權(quán)就會返回調(diào)用堆棧,在您的情況下是await conn.QueryAsync<RowSet>但是,您仍然只需通過調(diào)用 async 方法即可開始工作。該操作不會處于某種掛起狀態(tài)等待您調(diào)用Task.WhenAll,因此我們預(yù)計(jì)它已經(jīng)開始。除了聚合等待Task.WhenAll步驟之外,不執(zhí)行任何操作- 它在使事情實(shí)際發(fā)生方面沒有任何作用。

所以:我懷疑一切都已經(jīng)按預(yù)期工作,但簡單地說:任務(wù)報(bào)告為按照您請求的順序開始。這正是我們所期望的。


查看完整回答
反對 回復(fù) 2023-08-20
?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊

因?yàn)樗腥蝿?wù)都已在減速時(shí)間運(yùn)行。當(dāng)您從返回的 GetRow 方法分配任務(wù)時(shí),您已經(jīng)讓它開始了。然后使用 Task.WhenAll 創(chuàng)建一個(gè)新任務(wù),當(dāng)所有子任務(wù)完成時(shí),該任務(wù)將返回已完成。但你也沒有等到這個(gè)任務(wù)。


這樣就保證了當(dāng)三個(gè)任務(wù)完成時(shí)用await關(guān)鍵字執(zhí)行完成。


如果您可以用一個(gè)單獨(dú)的任務(wù)包裝所有執(zhí)行,您可以像這樣并行調(diào)用所有執(zhí)行



var queries = new[] { 

    "[dbo].[GET_Report_FirstRowSet]", 

    "[dbo].[GET_Report_SecondRowSet]", 

    "[dbo].[GET_Report_ThirdRowSet]" 

};


var tasks = queries.Select(query => new Task(()=>{

    return GetRows(query, requestParameters);

})).ToArray();


Task.WaitAll(tasks);


查看完整回答
反對 回復(fù) 2023-08-20
  • 2 回答
  • 0 關(guān)注
  • 247 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號