什么是标记异步方法为未实现/不支持或无效操作的正确方式?为简单起见,我将在示例中仅使用
同步地,我们可以简单地抛出异常:
这段代码在异步世界中的等效代码是什么?
这些方法有哪些并发症?有更好的方法吗?
为了避免出现“不需要在这里使用异步方法”或“这不是异步的”这样的情况,我会说该方法实现了某个接口或抽象类。
这是与3相同的代码,只不过在Task.Yeild()上添加了await关键字。
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();
}
编译器 只会生成无用的状态机,其语义与2等价。
/* 4 */ public async override Task XAsync() {
await Task.Yield();
throw new NotImplementedException();
}
这是与3相同的代码,只不过在Task.Yeild()上添加了await关键字。
async Task XAsync() { throw ...; }
是另一个选项。使用async
关键字。 - user743382