3 回答
TA贡献1946条经验 获得超3个赞
事实并非如此,假设一些愚蠢的事情,比如传递一个对象并使用强制转换计数来测试它:)
那这个呢?
public Task A(int id, Action<int> b) => A(id, x => { b(a); return Task.CompletedTask; });
这样你就不会重复代码。
TA贡献2003条经验 获得超2个赞
使用 RX 观察者模式实现。
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);
}
是你会假设下面的 Catch 实际上会捕获所有异常,但事实并非如此,并且只有当你等待或等待它时才会发生。简而言之,正确地做到这一点要复杂得多。
TA贡献1818条经验 获得超11个赞
就在这里:
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);
}
}
但现在你失去了类型安全(因为你可以通过任何委托)并且一无所获。
Task.Run有 8 个重载是有原因的: https ://referencesource.microsoft.com/#q=task.run
- 3 回答
- 0 关注
- 110 浏览
添加回答
举报