【问题标题】:How to do casting in AsAsyncOperation?如何在 AsAsyncOperation 中进行强制转换?
【发布时间】:2012-12-12 03:40:44
【问题描述】:

我正在参加有关 WinRT IAsyncOperation、异步、等待的速成课程。我正在尝试使用 IAsyncOperation 包装 Task,但未能想出一个简单的方法来进行转换。

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>();
    }
}

【问题讨论】:

    标签: asynchronous windows-runtime async-await


    【解决方案1】:
    public IAsyncOperation<IInfo> Parse()
    {
        return AsyncInfo.Run(async _ => (IInfo) await ParseList());
    }
    

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

    【讨论】:

    • 格言 pg。你太棒了。
    【解决方案2】:

    IAsyncOperation&lt;&gt; 类型不是协变的,这意味着您不能将 IAsyncOperation&lt;InfoList&gt; 强制转换为 IAsyncOperation&lt;IInfo&gt;

    尝试让您的ParseList 方法返回Task&lt;IInfo&gt;

    【讨论】:

    • 感谢您向我介绍“协变”这个词。 blogs.msdn.com/b/csharpfaq/archive/2010/02/16/…“接口和委托中泛型类型参数的差异(自 C# 4.0 起)”结论是 WinRT 给程序员增加了痛苦……
    • 但我想坚持使用 Task ParseList() 因为我认为返回类型应该更具描述性。实际上,我担心我添加的额外 Task.Run async 会给我的应用程序增加太多延迟。
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多