Windows8异步编程的注意事项

Windows8项目中涉及到下载数据和上传数据。针对小的数据使用的是WinJS.xhr(),而针对大的文件,不方便使用post方式直接上传的文件都使用BackgroundTransfer进行传输。因为Windows8 App虽然后台运行程序也是一个类似IE的进程,但是app和网页在开发中还是有一些不同,所以以下有两点总结。

 

1.默认Ajax请求,相同的url会缓存。

WWAHost.exe也会像IE一样,对相同的url返回的数据进行缓存。一般app都会进行CRUD操作,所以当我们进行操作完之后,我们必须更新数据。但是在一开始我更新了数据,但是界面始终不更新。

var rand = Math.random(); //为了演示,这里直接用了一个随机数,实际开发中最好以当前时间为种子的随机数,防止缓存 WinJS.xhr({ url: "http://localhost:50623/Default.aspx?t="+rand }) .done(function complete(result) { //do something. }, function error(result) { console.log(result.responseText); });

 

这样我们每次请求
default.aspx返回的数据应该是最新的。ASP.NET推出Web
API之后,后台最好不要写.aspx页面或者hanler,最好都使用Web API,这样传统的web应用,然后mobile
app和Windows8 app都可以调用相同的数据服务接口。相对而已比后台使用WCF还是要方便一些。

 

2.Ajax的异步。在Windows8 App开发中,这一点开发人员始终要牢记,否则代码出了问题,我们根本无法定位到代码哪里出错了。原先代码如下:var userInfo = null; function ShowUser() { var userid = 10001; GetUserInfoByAjax(userid); showUserInfo(); } function GetUserInfoByAjax(userid) { var random = Math.random(); WinJS.xhr({url:"http://localhost:50623/userinfo.aspx?userid="+userid+"&t="+rand}) .done(function complete(result) { //set the userInfo. userInfo = JSON.parse(result.responseText); }, function error(result) { Console.log(result.responseText); }); } function showUserInfo(){ document.getElementById("username").innerHTML=userInfo.username; document.getElementById("hometown").innerHTML=userInfo.hometown; }

 

自己一股劲的在调试,但是界面一直不
显示username和hometown,断点显示userInfo为null。但是在GetUserInfoByAjax()方法体里面
userInfo确实取得了服务器返回的数据。因为前端和后台代码都是自己写,所以有时真不确定是哪头的代码出了问题,所以有时单元测试特别的重要。这里
又要提到Web API,等项目结束之后把后台的代码重构为web api出来。

 

其实这个问题新手很容易范,因为
GetUserInfoByAjax(userid);在showUserInfo();
之前,所以肯定是先获得了userInfo,但是为什么在showUserInfo()里面的userInfo为null。我在写代码时,把Ajax异步
请求的概念忘了,WinJS.xhr()发送请求之后不能马上获得数据,这就是异步。所以在代码执行到showUserInfo()内部时,可能
userInfo还没有重新赋值,所以还是null。旁边的同事帮我看了一眼就发现我的错误做法。

 

在获得Ajax数据之后要执行的事情全部要放到Ajax成功方法体内,代码如下:function GetUserInfoByAjax(userid) { var random = Math.random(); WinJS.xhr({url:"http://localhost:50623/userinfo.aspx?userid="+userid+"&t="+rand}) .done(function complete(result) { //set the userInfo. userInfo = JSON.parse(result.responseText); showUserInfo(); }, function error(result) { Console.log(result.responseText); }); }

 

程序运行正常。从以上来看,我们在web开发过程中,很多问题都是由于我们对基础概念掌握的不好,或者忽略了最基本的概念,等到程序代码一多,问题就显得非常多,并且自己经常处在“不识庐山真面目,只缘身在此山中”。一直在自己写的错误代码里面打转。

时间: 2024-09-17 03:11:54

Windows8异步编程的注意事项的相关文章

详谈nodejs异步编程_node.js

目前需求中涉及到大量的异步操作,实际的页面越来越倾向于单页面应用.以后可以会使用backbone.angular.knockout等框架,但是关于异步编程的问题是首先需要面对的问题.随着node的兴起,异步编程成为一个非常热的话题.经过一段时间的学习和实践,对异步编程的一些细节进行总结. 1.异步编程的分类      解决异步问题方法大致包括:直接回调.pub/sub模式(事件模式).异步库控制库(例如async.when).promise.Generator等. 1.1 回调函数      

对 ASP.NET 异步编程的一点理解

本来这篇博文想探讨下异步中的异常操作,但自己在做异步测试的时候,又对 ASP.NET 异步有了新的认识,可以说自己之前对异步的理解还是有些问题,先列一下这篇博文的三个解惑点: async await 到底是什么鬼??? 异步操作中发生异常,该如何处理? 异步操作中发生异常(有无 catch throw 情况),Application_Error 会不会捕获? 之前测试过异步中的同步(很多种情况),这次我们把测试代码写更复杂些(异步中再进行异步),代码如下: [Route("")]  [

Javascript异步编程的4种方法

你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏 览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其

C#编程总结(六)异步编程

1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程 计算机或查询数据库.异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个 操作时,应用程序可在异步方法执行其任务时继续执行. 2.同步与异步的区别 同步 (Synchronous):在执行某个操作时,应用程序必须等待该操作执行完成后才能继续执行. 异 步(Asynchronous):在执行某个操作时,应用程序可在异步操作执行时继续执行.实质:异步操作, 启动了新的线程,主线程与方法线程并行执行

如何设计一门编程语言(八) 异步编程和CPS变换

关于这个话题,其实在(六)里面已经讨论了一半了.学过Haskell的都知道,这个世界上很多东西都可以用monad和comonad来把一些复杂的代码给抽象成简单的.一看就懂的形式.他们的区别,就像用js做一个复杂的带着几层循环的动画,直接写出来和用jquery的"回调"写出来的代码一样.前者能看不能用,后者能用不能看.那有没有什么又能用又能看的呢?我目前只能在Haskell.C#和F#里面看到.至于说为什么,当然是因为他们都支持了monad和comonad.只不过C#作为一门不把&quo

Generator与异步编程概述

在<深入浅出Node.js>的第4章里,笔者深入地介绍了当前盛行在Node和前端JavaScript中的几种异步编程的解决方案,唯独对Generator的解决方案没有介绍.但随着Node版本的升级和ECMAScript harmony的特性不断得到支持,在0.11版本中,我们可以通过启用--harmory参数让V8支持Generator.最近Connect/Express背后的开发团队也将精力转移到新的库和框架上,这个核心库和框架就是co和koa,它们最主要的特点主要就是基于ECMAScrip

Asp.Net异步编程知识

写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到各种打着Asp.Net异步编程的口号,如何提高性能,如何提高吞吐率! 好多文章都说得不清楚,甚至是错误的.只看到了一些表现,混淆概念.希望这篇文章能够能够对一部分人理解Asp.net异步编程模型. 1基础知识,谈一个初学者不容易理解的基础知识,这个基础知识,很不基础的哦 先看这个代码 ThreadPool.GetMaxTh

Windows 8 Store Apps学习(45) 多线程之异步编程: IAsyncAction

多线程之异步编程: IAsyncAction, IAsyncOperation 重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress 介绍 重新想象 Windows 8 Store Apps 之 异步编程 IAsyncAction - 无返回值,无进度值 IAsyncOperation - 有返回

Windows 8 Store Apps学习(44) 多线程之异步编程

多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 介绍 重新想象 Windows 8 Store Apps 之 异步编程 经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例 1.使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类 Thread/Async/ClassicAsync.cs /*