假設我有一個回傳型別物件的方法ValueTask,例如WaitToReadAsyncon 方法ChannelReader。我可以通過三種方式使用它ValueTask。我可以:
- 直接等待。
- 把它變成一個任務,然后等待它(用
.AsTask()) - 查詢
.Result屬性是否已同步完成(如果.IsCompleted是true)。
關于第三種方法(呼叫.ResultValueTask),MSDN 檔案指出該屬性只能查詢一次。但是,這個屬性是否需要查詢?換句話說,從不查詢 a 的結果可以ValueTask嗎?
這是我的意思的一個例子:
var channel = Channel.CreateUnbounded<int>();
var waitToReadValueTask = channel.Reader.WaitToReadAsync(default);
if (waitToReadValueTask.IsCompleted)
{
if (channel.Reader.TryRead(out var result))
{
// Do something with the result object.
}
}
在此示例中,waitToReadValueTask從未使用過。它從來沒有被等待,也沒有.Result要求它。這個可以嗎?
uj5u.com熱心網友回復:
好問題。是的,如果您對結果不感興趣,或者對可能存盤在任務中的內容不感興趣,那么省略查詢 a 的Result屬性是完全可以的。如果您愿意,也可以在創建后完全忽略它,從而產生所謂的即發即棄任務。即使您沒有保留任何參考,該任務仍將完成。ValueTask<T>ExceptionValueTask
一般來說ValueTask,通過awaiting 它們或通過AsTasking 它們或通過查詢它們Result(假設它們已經完成)來消耗你的 s 是一個好主意。通過使用ValueTask你的信號給底層實作,支持IValueTaskSource<T>實體可以被重用。當異步方法無法同步完成時,重用IValueTaskSource<T>實體是基于 的 API 避免記憶體分配的方式。ValueTask
在您的示例中,您IsCompleted在創建后立即查詢屬性,因此在創建時未完成的ValueTask可能性很小。ValueTask因此,關于您的示例,上述建議僅具有理論價值。ValueTask在創建時完成的 s 不受實體的支持,因此在您的示例中IValueTaskSource<T>不查詢不會影響性能。Result如果您IsCompleted在創建ValueTask.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471673.html
