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~