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

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

async Func

async Func

C#
飲歌長嘯 2023-12-17 10:49:07
方法內(nèi)的 3 個(gè)調(diào)用有什么區(qū)別WhatDifferences?這是測試代碼:async Task WhatDifferences(Context context){    await ActionAsync(context, async x => await IsOddAsync(x).ConfigureAwait(false));    await ActionAsync(context, x => IsOddAsync(x));    await ActionAsync(context, IsOddAsync);}async Task<T> ActionAsync<T>(Context context, Func<Context, Task<T>> action){    return await action(context).ConfigureAwait(false);}async Task<bool> IsOddAsync(Context context){    return await Task.Run(() => context.Count++ % 2 == 1).ConfigureAwait(false);}class Context{    public int Count { get; set; }}我正在嘗試決定在我的代碼庫中使用哪一個(gè),并且根據(jù)我的知識(shí),所有 3 個(gè)的行為都是相同的。問題與不同傳遞異步委托的方法簽名是什么?如果我表現(xiàn)得更有邏輯,你可能會(huì)知道我的擔(dān)憂async Task<T> ActionAsync<T>(Context context, Func<Context, Task<T>> action){    using (var transaction = new TransactionScope())    {        //do some async logic before action        var result = await action(context).ConfigureAwait(false);        //do other async validation logic after action        return result;    }}
查看完整描述

2 回答

?
慕婉清6462132

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

我正在嘗試決定在我的代碼庫中使用哪一個(gè),并且根據(jù)我的知識(shí),所有 3 個(gè)的行為都是相同的。

在這個(gè)具體例子中,這基本上是正確的。

此創(chuàng)建一個(gè)引用?IsOddAsync?方法的委托:

await?ActionAsync(context,?IsOddAsync);

這個(gè)為 lambda 表達(dá)式創(chuàng)建一個(gè)方法,委托引用編譯器生成的方法:

await?ActionAsync(context,?x?=>?IsOddAsync(x));

這個(gè)函數(shù)的作用相同,但對(duì)于異步 lambda,因此編譯器生成的方法也有一個(gè)?async?狀態(tài)機(jī):

await?ActionAsync(context,?async?x?=>?await?IsOddAsync(x).ConfigureAwait(false));

一般來說,你的問題可以歸結(jié)為兩個(gè)問題:

  1. 我應(yīng)該使用方法組而不是 lambda 嗎?是的你應(yīng)該。這樣做沒有任何缺點(diǎn),而且效率更高、代碼更短,而且對(duì)可維護(hù)性沒有任何影響。

  2. 我應(yīng)該刪除async/await還是保留關(guān)鍵字?這個(gè)更加細(xì)致。

在這種特殊情況下省略?沒問題,因?yàn)?lambda 所做的只是調(diào)用單個(gè)方法并傳遞其參數(shù)。在調(diào)用?之前或之后,lambda 不可能拋出異常。async?asyncIsOddAsync

但是,如果您的 lambda 更復(fù)雜 - 在將?x?傳遞給?IsOddAsync?之前對(duì)其進(jìn)行操作,或者對(duì)結(jié)果進(jìn)行操作,或者使用using?塊,那么您需要保留?async/await?關(guān)鍵字以獲得最大的可維護(hù)性。


查看完整回答
反對(duì) 回復(fù) 2023-12-17
?
鴻蒙傳說

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

await與返回Task

和...之間的不同:

await?ActionAsync(context,?async?x?=>?await?IsOddAsync(x).ConfigureAwait(false));
await?ActionAsync(context,?x?=>?IsOddAsync(x));

在某些情況下,您不需要?await(當(dāng)然也不需要?async

執(zhí)行異步操作的方法不需要使用await,如果:

  • 方法內(nèi)部只有一次異步調(diào)用

  • 異步調(diào)用在方法的最后

  • 沒有必要捕獲/處理任務(wù)中可能發(fā)生的異常

在這種情況下,您可以中間返回Task。

請(qǐng)注意,行為上存在細(xì)微差別 - 取決于IsOddAsync的實(shí)現(xiàn):

重要提示:返回任務(wù)而不是等待它,會(huì)更改方法的異常行為,因?yàn)樗粫?huì)在啟動(dòng)任務(wù)的方法中拋出異常,而是在等待任務(wù)的方法中拋出異常。

正如 Gabriel Luci 所指出的,在當(dāng)前實(shí)現(xiàn)的?IsOddAsync(一次調(diào)用和一次?await)中,行為沒有差異。

x => IsOddAsync(x)IsOddAsync

和...之間的不同

await?ActionAsync(context,?x?=>?IsOddAsync(x));
await?ActionAsync(context,?IsOddAsync);

在第一個(gè)中,您將使用參數(shù)創(chuàng)建一個(gè)匿名 (lambda) 方法x。由于?IsOddAsync?也有一個(gè)參數(shù)(類型相同),因此不需要 lambda 方法。

請(qǐng)注意,如果?IsOddAsync?有其他參數(shù),例如,您需要 lambda和第二個(gè)參數(shù),那么你需要 lambda。示例:

await?ActionAsync(context,?x?=>?IsOddAsync(x,?"mySecondParameter"));

在這種情況下,除了內(nèi)部拋出異常時(shí)的調(diào)用堆棧之外,行為沒有任何區(qū)別。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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