亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從getter或setter調用異步方法?

如何從getter或setter調用異步方法?

C#
達令說 2019-08-31 15:06:07
從C#中的getter或setter調用異步方法最優雅的方法是什么?這里有一些偽代碼可以幫助解釋自己。async Task<IEnumerable> MyAsyncMethod(){    return await DoSomethingAsync();}public IEnumerable MyList{    get    {         //call MyAsyncMethod() here    }}
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

沒有技術原因async在C#中不允許使用屬性。這是一個有目的的設計決策,因為“異步屬性”是矛盾的。


屬性應返回當前值; 他們不應該開始背景操作。


通常,當有人想要“異步屬性”時,他們真正想要的是以下之一:


一種返回值的異步方法。在這種情況下,將屬性更改為async方法。

可以在數據綁定中使用但必須異步計算/檢索的值。在這種情況下,要么使用async工廠方法來包含對象,要么使用async InitAsync()方法。數據綁定值將default(T)一直到計算/檢索該值。

一個創建起來很昂貴的值,但應該緩存以供將來使用。在這種情況下,請使用AsyncLazy 我的博客或AsyncEx庫。這將為您提供一個有await能力的財產。

更新:我在我最近的一篇“異步OOP”博客文章中介紹了異步屬性。


查看完整回答
反對 回復 2019-08-31
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

您不能異步調用它,因為沒有異步屬性支持,只有異步方法。因此,有兩個選項,都利用了CTP中的異步方法實際上只是一個返回的方法Task<T>或Task:


// Make the property return a Task<T>

public Task<IEnumerable> MyList

{

    get

    {

         // Just call the method

         return MyAsyncMethod();

    }

}

要么:


// Make the property blocking

public IEnumerable MyList

{

    get

    {

         // Block via .Result

         return MyAsyncMethod().Result;

    }

}


查看完整回答
反對 回復 2019-08-31
  • 3 回答
  • 0 關注
  • 853 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號