将异步方法标记为未实现/不支持或无效操作的正确方法是什么?为了简单起见,我将在示例中仅使用NotImplementedException
,但该问题同样适用于NotSupportedException
和InvalidOperationException
。未实现/支持/无效操作异步方法
在同步方式一个简单的会抛出异常:
public override void X() {
throw new NotImplementedException();
}
什么是这个代码在异步世界的相同呢?
/* 1 */ public override Task XAsync() {
throw new NotImplementedException();
}
或者
/* 2 */ public override Task XAsync() {
return Task.FromException(new NotImplementedException());
}
这些是什么方法的并发症?有没有更好的方法?
为了避免“不,你并不需要一个方法是异步这里” /“它不是异步”我要说的是,该方法实现了一些接口或抽象类。
这我不考虑一些方法:
/* 3 */ public async override Task XAsync() { // here is an CS1998 warning
throw new NotImplementedException();
}
编译器would just generate the useless state machine,这是语义上等价于2
/* 4 */ public async override Task XAsync() {
await Task.Yield();
throw new NotImplementedException();
}
这是the same为3,但增加了等待在Task.Yeild();
好问题。第一个选项在调用方法时抛出异常,第二个选项在等待结果时抛出异常。我对第一种选择有一个小偏好,因为它“提前失败”,但我很好奇专家们会说些什么。 – Heinzi
也许它有帮助:http:// stackoverflow。com/a/13254787/316799 –
是啊,@ FelipeOriani看到了这个,谢谢 – hazzik