2012-12-10 31 views
0

我在WinRT IAsyncOperation,async等待崩潰課程。我試圖用IAsyncOperation包裝任務,但沒有想出一個簡單的方法來執行投射。如何在AsAsyncOperation中進行投射?

public interface IInfo{} 
public class InfoList : IInfo{} 

public class Parser { 
    private async Task<InfoList> ParseList() { 
     var returnList = new InfoList(); 

     HttpClient client = new HttpClient(); 
     Task<string> htmlTask = client.GetStringAsync("http://stackoverflow.com"); 

     string html = await htmlTask; 
     // parsing logic... 
     return returnList; 
    } 

    public IAsyncOperation<IInfo> Parse() 
    { 
     return AsyncInfo.Run(_ => 
      Task.Run<IInfo>(async() => 
      { 
       var returnList = await ParseList(); 
       return returnList; 
      }) 
     ); 
     // I have tried following but causes InvalidCastException 
     //return (IAsyncOperation<IInfo>)ParseList().AsAsyncOperation<InfoList>(); 
    } 
} 

回答

3
public IAsyncOperation<IInfo> Parse() 
{ 
    return AsyncInfo.Run(async _ => (IInfo) await ParseList()); 
} 

public IAsyncOperation<IInfo> Parse() 
{ 
    return AsyncInfo.Run(_ => ParseList().ContinueWith(t => (IInfo)t.Result)); 
} 
+0

maxim pg。你太棒了。 – Dummy

2

IAsyncOperation<>類型不是協變的,這意味着你可以不投一個IAsyncOperation<InfoList>IAsyncOperation<IInfo>

嘗試讓ParseList方法返回Task<IInfo>

+0

感謝引入單詞 「協變」 給我。 http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx 「差異在接口和委託(因爲一般類型參數C#4.0 )「 結論是WinRT增加了程序員的痛苦...... – Dummy

+0

但我想堅持任務 ParseList(),因爲我認爲返回類型應該更具描述性。實際上,我擔心由我添加的額外Task.Run 異步會爲我的應用程序增加太多延遲。 – Dummy