3 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
事實(shí)并非如此,假設(shè)一些愚蠢的事情,比如傳遞一個(gè)對(duì)象并使用強(qiáng)制轉(zhuǎn)換計(jì)數(shù)來測(cè)試它:)
那這個(gè)呢?
public Task A(int id, Action<int> b) => A(id, x => { b(a); return Task.CompletedTask; });
這樣你就不會(huì)重復(fù)代碼。

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
使用 RX 觀察者模式實(shí)現(xiàn)。
source.Subscribe(o => Log.Write($"On Next {o}"));
或者如果您指定其他前置條件和后置條件
source
.Do(_ => Log.Write("Before"))
.Finally(()=> Log.Write("After"))
.Subscribe(
o => Log.Write($"On Next {o}"),
exception => Log.Write($"On Error {exception}")
() => Log.Write("On Completed"));
問題在于
try
{
await BeforeAsync(id);
b(id);
await AfterAsync(id);
}
是你會(huì)假設(shè)下面的 Catch 實(shí)際上會(huì)捕獲所有異常,但事實(shí)并非如此,并且只有當(dāng)你等待或等待它時(shí)才會(huì)發(fā)生。簡(jiǎn)而言之,正確地做到這一點(diǎn)要復(fù)雜得多。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
就在這里:
public async Task A(int id, Delegate b)
{
try
{
await BeforeAsync(id);
if (b.DynamicInvoke(id) is Task task) await task;
await AfterAsync(id);
}
catch (Exception ex)
{
Handle(ex, id);
}
}
但現(xiàn)在你失去了類型安全(因?yàn)槟憧梢酝ㄟ^任何委托)并且一無所獲。
Task.Run有 8 個(gè)重載是有原因的: https ://referencesource.microsoft.com/#q=task.run
- 3 回答
- 0 關(guān)注
- 147 瀏覽
添加回答
舉報(bào)