Asynchronous 如何进行铸造操作?

Asynchronous 如何进行铸造操作?,asynchronous,windows-runtime,async-await,Asynchronous,Windows Runtime,Async Await,我正在上WinRT IAsyncOperation、async和Wait的速成班。我试图用IAsyncOperation来完成这个任务,但没能想出一个简单的方法来完成这个任务 public interface IInfo{} public class InfoList : IInfo{} public class Parser { private async Task<InfoList> ParseList() { var returnList = new

我正在上WinRT IAsyncOperation、async和Wait的速成班。我试图用IAsyncOperation来完成这个任务,但没能想出一个简单的方法来完成这个任务

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>();
    }
}
公共接口IInfo{}
公共类信息列表:IInfo{}
公共类解析器{
专用异步任务解析列表(){
var returnList=new InfoList();
HttpClient=新的HttpClient();
任务htmlTask=client.GetStringAsync(“http://stackoverflow.com");
字符串html=等待htmlTask;
//分析逻辑。。。
退货清单;
}
公共IAsyncOperation解析()
{
返回AsyncInfo.Run(\u=>
Task.Run(异步()=>
{
var returnList=await ParseList();
退货清单;
})
);
//我试过跟随,但导致无效的例外
//返回(IAsyncOperation)ParseList().asAsAsAsyncOperation();
}
}
类型
IAsyncOperation
不是协变的,这意味着您不能将
IAsyncOperation
强制转换为
IAsyncOperation

尝试让您的
ParseList
方法返回一个
任务

IAsyncOperation
类型是不可协变的,这意味着您不能将
IAsyncOperation
强制转换为
IAsyncOperation

public IAsyncOperation<IInfo> Parse()
{
    return AsyncInfo.Run(async _ => (IInfo) await ParseList());
}
尝试让您的
ParseList
方法返回一个
Task

公共IAsyncOperation Parse()
public IAsyncOperation<IInfo> Parse()
{
    return AsyncInfo.Run(async _ => (IInfo) await ParseList());
}
{ 返回AsyncInfo.Run(async=>(IInfo)wait ParseList()); }

public IAsyncOperation Parse()
{
返回AsyncInfo.Run(=>ParseList().ContinueWith(t=>(IInfo)t.Result));
}
公共IAsyncOperation解析()
{
返回AsyncInfo.Run(async=>(IInfo)wait ParseList());
}

public IAsyncOperation Parse()
{
返回AsyncInfo.Run(=>ParseList().ContinueWith(t=>(IInfo)t.Result));
}

感谢您向我介绍“协变”一词。“接口和委托中泛型类型参数的差异(因为C#4.0)”结论是WinRT给程序员增加了痛苦……但我想坚持使用Task ParseList(),因为我认为返回类型应该更具描述性。实际上,我担心我添加的额外任务.Run async会给我的应用程序增加太多的延迟。谢谢你给我介绍“协变”这个词。“接口和委托中泛型类型参数的差异(因为C#4.0)”结论是WinRT给程序员增加了痛苦……但我想坚持使用Task ParseList(),因为我认为返回类型应该更具描述性。实际上,我担心我添加的额外任务.Run async会给我的应用程序增加太多延迟。maxim pg。你太棒了。maxim pg。你太棒了。