將異步方法標記爲未實現/不支持或無效操作的正確方法是什麼?爲了簡單起見,我將在示例中僅使用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