2013-06-30 94 views
0

我有一個DesignDataService類不能等待「Model.PersonalInfo」

public async Task<T> GetData<T>(T dataObject) 
{ 
    var typeName = typeof(T).Name;  
    switch (typeName) 
    { 
     case "PersonalInfo": 
      var person = new PersonalInfo 
        { 
        FirstName = "Mickey", 
        LastName = "Mouse" , 
        Adres = new Address{Country="DLRP"} , 
       }; 
     return await person; 

    } // end Switch 

} // GetData<T> 

以下方法如何從DataService在返回一個新的PersonalInfo類?

現在我得到的錯誤不能等待「Model.PersonalInfo」

即使當我改變return語句如下回等待的人因爲任務; 錯誤保持不變

+0

爲什麼你需要等待?,你已經創建了對象,所以我看不到任何理由運行是異步的。 –

回答

0

您正在混合兩件事。您使用async註釋方法來指示編譯器,您希望能夠await異步操作(在任務中)。

另一方面,返回值是Task。你可以將兩者混合,但在你的情況下(async Task<T>),這意味着你正在返回一個操作的異步承諾,但你也等待方法內的結果,這肯定不是你想要的結果。

+0

謝謝,我刪除了異步,錯誤消失了。希望它也能用於實時數據。但那是明天。 問候 – Gooftroop

0

如果PersonalInfo的創建預計需要很長時間,則需要將對象的創建添加到任務中並等待。

您似乎對您的方法沒有類型限制,因此要返回PersonalInfo您必須將其從object轉換爲T

實施例:

public async Task<T> GetData<T>(T dataObject) 
    { 
     var typeName = typeof(T).Name; 
     switch (typeName) 
     { 
      case "PersonalInfo": 
       return await Task<T>.Factory.StartNew(() => 
       { 
        return (T)(object)new PersonalInfo 
        { 
         FirstName = "Mickey", 
         LastName = "Mouse", 
         Adres = new Address { Country = "DLRP" }, 
        }; 
       }); 
     } 
     return default(T); 
    } 
+0

如果該方法已經是異步並返回任務,那麼不需要創建另一個任務並等待它,是嗎? – caesay

+0

剛做了一個測試。內部任務不是必需的..您可以簡單地返回新的個人信息對象。 – caesay

+0

沒有必要等待,我的假設是,這是一個演示和創建'PersonalInfo'需要數據庫或WebService調用,否則我不知道爲什麼異步是必需的,因爲該對象已被創建。 –

2

即使該函數返回一個Task,沒有要求使用async關鍵字。

在這裏,你可以簡單地使用Task.FromResult

public Task<T> GetData<T>(T dataObject) where T : MyKnownBaseObject 
{ 
    var typeName = typeof(T).Name;  
    switch (typeName) 
    { 
     case "PersonalInfo": 
      var person = new PersonalInfo 
        { 
        FirstName = "Mickey", 
        LastName = "Mouse" , 
        Adres = new Address{Country="DLRP"} , 
       }; 
      return Task.FromResult<T>(person); 
      break; 
     default: 
       return Task.FromResult<T>(default(T)); 

    } // end Switch 

} // GetData<T> 

這不會工作委託給另一個線程。如果您有少量工作不適合parralellism,但此方法仍然有效,但仍必須強制該方法返回任務以與其他方法兼容。

+1

+1。 @Gooftroop,通常使用這種方法的設計時類型或測試存根(具有*非* -'async'實現的'Task.FromResult')。 –