第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

構(gòu)造函數(shù)可以是異步的嗎?

構(gòu)造函數(shù)可以是異步的嗎?

C#
函數(shù)式編程 2019-08-03 07:03:25
我有一個項目,我試圖在構(gòu)造函數(shù)中填充一些數(shù)據(jù):public class ViewModel{     public ObservableCollection<TData> Data { get; set; }     async public ViewModel()     {         Data = await GetDataTask();     }     public Task<ObservableCollection<TData>> GetDataTask()     {         Task<ObservableCollection<TData>> task;         //Create a task which represents getting the data         return task;     }}不幸的是,我收到了一個錯誤:改性劑async對此項目無效。當(dāng)然,如果我包裝一個標(biāo)準(zhǔn)方法并從構(gòu)造函數(shù)調(diào)用它:public async void Foo(){     Data = await GetDataTask();}效果很好。同樣的,如果我用舊的內(nèi)出方式GetData().ContinueWith(t => Data = t.Result);這也很管用。我只是想知道為什么我們不能打電話await直接從構(gòu)造函數(shù)中刪除??赡苡泻芏?甚至明顯的)邊緣情況和反對它的理由,我只是想不出任何。我也四處尋找解釋,但似乎找不到任何解釋。
查看完整描述

3 回答

?
狐的傳說

TA貢獻1804條經(jīng)驗 獲得超3個贊

構(gòu)造函數(shù)的作用非常類似于返回構(gòu)造類型的方法。和async方法不能返回任何類型,它必須是“火而忘”。void,或Task.

如果類型的構(gòu)造函數(shù)T實際上回來了Task<T>,我想這會讓人很困惑。

如果異步構(gòu)造函數(shù)的行為方式與async void方法,這種類型破壞了構(gòu)造函數(shù)的意義。構(gòu)造函數(shù)返回后,您應(yīng)該得到一個完全初始化的對象。而不是將來在某個未定義的點上被正確初始化的對象。也就是說,如果幸運的話,異步初始化不會失敗。

這一切只是猜測而已。但在我看來,擁有異步構(gòu)造函數(shù)的可能性會帶來更多的麻煩。

如果你真的想要的“火和忘記”語義學(xué)async void方法(如果可能的話,應(yīng)該避免),您可以輕松地將所有代碼封裝在async void方法,并從構(gòu)造函數(shù)中調(diào)用它,正如您在問題中提到的那樣。




查看完整回答
反對 回復(fù) 2019-08-05
?
慕運維8079593

TA貢獻1876條經(jīng)驗 獲得超5個贊

由于不可能創(chuàng)建異步構(gòu)造函數(shù),所以我使用了一個靜態(tài)異步方法,該方法返回由私有構(gòu)造函數(shù)創(chuàng)建的類實例。這不雅致,但效果不錯。

   public class ViewModel       
   {       
    public ObservableCollection<TData> Data { get; set; }       

    //static async method that behave like a constructor       
    async public static Task<ViewModel> BuildViewModelAsync()  
    {       
     ObservableCollection<TData> tmpData = await GetDataTask();  
     return new ViewModel(tmpData);
    }       

    // private constructor called by the async method
    private ViewModel(ObservableCollection<TData> Data)
    {
     this.Data=Data;   
    }
   }



查看完整回答
反對 回復(fù) 2019-08-05
?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

您的問題類似于創(chuàng)建文件對象和打開文件。實際上,在實際使用對象之前,有很多類需要執(zhí)行兩個步驟:Create+Initialization(通常稱為類似于Open)。

它的優(yōu)點是構(gòu)造函數(shù)可以是輕量級的。如果需要,可以在實際初始化對象之前更改一些屬性。設(shè)置所有屬性時,Initialize/Open函數(shù)來準(zhǔn)備要使用的對象。這,這個Initialize函數(shù)可以是異步的。

缺點是您必須信任您的類的用戶,他將調(diào)用該用戶。Initialize()在他使用你類的任何其他函數(shù)之前。事實上,如果你想讓你的課充分證明(傻瓜證明?)您必須簽入每個函數(shù)Initialize()已經(jīng)被召喚了。

使這更容易的模式是聲明構(gòu)造函數(shù)私有,并使一個公共靜態(tài)函數(shù)來構(gòu)造對象并調(diào)用。Initialize()在返回構(gòu)造的對象之前。這樣,您就會知道每個訪問對象的人都使用了Initialize功能。

該示例顯示了一個類,該類模擬所需的異步構(gòu)造函數(shù)。

public MyClass{
    public static async Task<MyClass> CreateAsync(...)
    {
        MyClass x = new MyClass();
        await x.InitializeAsync(...)
        return x;
    }

    // make sure no one but the Create function can call the constructor:
    private MyClass(){}

    private async Task InitializeAsync(...)
    {
        // do the async things you wanted to do in your async constructor
    }

    public async Task<int> OtherFunctionAsync(int a, int b)
    {
        return await OtherFunctionAsync(a, b);
    }

使用情況如下:

public async Task<int> SomethingAsync(){
    // Create and initialize a MyClass object
    MyClass myObject = await MyClass.CreateAsync(...);

    // use the created object:
    return await myObject.OtherFunctionAsync(4, 7);}




查看完整回答
反對 回復(fù) 2019-08-05
  • 3 回答
  • 0 關(guān)注
  • 661 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號