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

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

使用 Task.Run 和 Parallel.For 的任務(wù) null

使用 Task.Run 和 Parallel.For 的任務(wù) null

C#
九州編程 2021-12-05 16:49:34
我有兩個(gè)最終都會(huì)更新同一個(gè)對(duì)象的服務(wù),因此我們進(jìn)行了測(cè)試以確保對(duì)該對(duì)象的寫入完成(在幕后我們對(duì)每個(gè)服務(wù)都有重試策略)。10 次中有 9 次,一個(gè)或多個(gè)理論將失敗,并且task.ShouldNotBeNull();始終是失敗的斷言。這個(gè)示例中的異步代碼有什么問題?為什么任務(wù)會(huì)是空的?    [Theory]    [InlineData(1)]    [InlineData(5)]    [InlineData(10)]    [InlineData(20)]    public async Task ConcurrencyIssueTest(int iterations)    {        var orderResult = await _driver.PlaceOrder();        var tasksA = new List<Task<ApiResponse<string>>>();        var tasksB = new List<Task<ApiResponse<string>>>();        await Task.Run(() => Parallel.For(1, iterations,            x =>            {                tasksA.Add(_Api.TaskA(orderResult.OrderId));                tasksB.Add(_Api.TaskB(orderResult.OrderId));            }));        //Check all tasks return successful                   foreach (var task in tasksA)        {            task.ShouldNotBeNull();            var result = task.GetAwaiter().GetResult();            result.ShouldNotBeNull();            result.StatusCode.ShouldBe(HttpStatusCode.OK);        }         foreach (var task in tasksB)        {            task.ShouldNotBeNull();            var result = task.GetAwaiter().GetResult();            result.ShouldNotBeNull();            result.StatusCode.ShouldBe(HttpStatusCode.OK);        }    }}
查看完整描述

2 回答

?
蕭十郎

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

這里不需要 Tasks 和 Parrallel 循環(huán)。我假設(shè)你的_api調(diào)用是 IO 綁定的?你想要更像這樣的東西:


var tasksA = new List<Task<ApiResponse<string>>>();

var tasksB = new List<Task<ApiResponse<string>>>();


//fire off all the async tasks

foreach(var it in iterations){

   tasksA.Add(_Api.TaskA(orderResult.OrderId));

   tasksB.Add(_Api.TaskB(orderResult.OrderId));

}


//await the results

await Task.WhenAll(tasksA).ConfigureAwait(false);


foreach (var task in tasksA)

{

    //no need to get GetAwaiter(), you've awaited above.

    task.Result;


//to get the most out of the async only await them just before you need them

await Task.WhenAll(tasksB).ConfigureAwait(false);


foreach (var task2 in tasksB)

{

     task2.Result;

}

這將觸發(fā)您所有的 api 調(diào)用,async然后在結(jié)果返回時(shí)阻塞。您 Parallel for 和 tasks 只是使用額外的線程池線程來(lái)實(shí)現(xiàn)零收益。


如果_api受 CPU 限制,您可以從中受益,Task.Run但我猜這些是 web api 或其他東西。所以Task.Run除了使用額外的線程之外什么都不做。


查看完整回答
反對(duì) 回復(fù) 2021-12-05
?
嗶嗶one

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

正如其他人所建議的那樣,刪除Parallel, 和await在asserting他們之前完成的所有任務(wù)。


我還建議.Result從每個(gè)任務(wù)中刪除,而await不是它們。


public async Task ConcurrencyIssueTest(int iterations)

{

    var orderResult = await _driver.PlaceOrder();


    var taskA = _Api.TaskA(orderResult.OrderId);

    var taskB = _Api.TaskB(orderResult.OrderId);


    await Task.WhenAll(taskA, taskB);


    var taskAResult = await taskA;


    taskAResult.ShouldNotBeNull();

    taskAResult.StatusCode.ShouldBe(HttpStatusCode.OK);


    var taskBResult = await taskB;


    taskBResult.ShouldNotBeNull();

    taskBResult.StatusCode.ShouldBe(HttpStatusCode.OK);

}


查看完整回答
反對(duì) 回復(fù) 2021-12-05
  • 2 回答
  • 0 關(guān)注
  • 169 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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