Windows phone 7 移植到 Windows phone 8 之(AsyncCtpLibrary_Phone 的错误与异常)

 

1.先说下背景。

之前研究了下Async-CTP-v3 异步编程的方式。发现可以使程序从逻辑上清晰无比,然后就在vs2010安装了Async-CTP-v3。

并在工作的项目中重写了http访问层,主要用到了Task,async,await等关键字和像GetRequestStreamAsync()这种类型的扩展方法。

 

2.主要的内容。

 下面先说下wp8 SDK的迁移从以前的wp7项目

用vs2012打开vs2010的vs项目会弹出一个htm迁移报告,就是这个。有警告的2个项目都不是重要的,让我很欣慰。

然后接下来我编译了一遍项目。说找不到关键字。

由于可能这还是7.1的项目吧。我将项目都升级到wp8.0.升级到wp8.0的方法就是在解决方案管理器里面,右键每一个项目,点击升级到

windows phone 8.0,在升级的时候,有的项目会短暂无反应。一会就好了。然后编译,就发现了主要问题。

主要说是一个System.Threading.Tasks.Task这个类在AsyncCtpLibrary_Phone.dll和mscorlib.dll中同时存在。

然后我想那就把之前的AsyncCtpLibrary这个从引用中移除。~~.然后就发现之前在AsyncCtpLibrary这个里面的一些扩展方法都不见了。也就是说新的sdk

包含了支持了await,async,但AsyncCtpLibrary_Phone.dll这个dll中的扩展方法是没有给的。这真心坑呀。我重写引回去,扩展方法是有了,但是2个程序集

中都有Task这个类。编译就会报错。。。。。。。。。。。

 

3.现在的解决方案。

我用.net reflector反编了AsyncCtpLibrary_Phone这个dll。看到了里面有2个扩展方法的类。还有一些命名空间。

 找到了我想要的GetRequestStreamAsync()方法。然后就在项目里面自己写了这个扩展方法。当然这里的扩展方法很多。别的扩展方法与这个就类似了。

    public static class AsyncCtpLibrary
    {
        public static Task<Stream> GetRequestStreamAsync(this WebRequest source)
        {
            return Task<Stream>.Factory.FromAsync(new Func<AsyncCallback, object, IAsyncResult>(source.BeginGetRequestStream), new Func<IAsyncResult, Stream>(source.EndGetRequestStream), null);
        }
    }

还有就是TaskEx.WhenAll<T>这个静态方法也没有 了,编译不过。但我发现Task.WaitAll<>和之前的这个方法是一样的。然后就不用自己写了。

把之前的TaskEx都换成Task就可以了。这之后程序算可以编译过了,有几个警告。跑了一下,网络获取是没有问题的。代码上算是成功了。

程序跑起来,试了下3种分辨下的界面,发现还有有一些界面需要适配的。基本都是因为ListBox的高度是固定的,不是动态的原因。

更多问题以后发现了在写出来分享给大家。。。O(∩_∩)O~

posted @ 2012-11-01 00:32  tinyqf  阅读(1041)  评论(4编辑  收藏  举报