不要在 ASP.NET 4.5 Beta 的 Page 类事件上直接使用 async 与 await

发现问题

在我的上一篇文章《async 与 await 在 Web 下的应用》中,我提到了 asp.net 4.5 在 Web.Config 中的一个奇怪配置:

<appSettings>
  <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>

Stack Overflow 上提问后,终于有人回答我了。

看了别人的回复后,才发现了我上篇文章中的问题。

下面代码中的这种用法是错误的:

protected async void Page_Load(object sender, EventArgs e)
{
    WebClient client = new WebClient();
    var result1 = await client.DownloadStringTaskAsync("http://www.website.com");
    WebClient client2 = new WebClient();
    var result2 = await client.DownloadStringTaskAsync(result1);
    //do more
}

利用 DNSPod 解决 Godaddy 域名在国内无法解析的问题

我们是共产主义的接班人

“我们是共产主义的接班人,继承革命先烈的光荣传统…”

我的域名非常荣幸地被部分服务商墙了。

当我在学校里用 ChinaUnicom 上网的时候,我的网站一直是无法打开的,一直以为是偶然的问题,因为我的虚拟主机供应商不太稳定。

后来也有网友给我反映相同的问题,这时候我才意识到问题的严重性。

还好中国电信的可以上,所以没有影响到大部分网友的访问。

async 与 await 在 Web 下的应用

.net 中的异步

关于 .net 的异步,一篇文章是讲不完的,我这里就贴两篇文章让大家看一下:

《正确使用异步操作》《C#客户端的异步操作》《细说ASP.NET的各种异步操作》

另外,在 .net 4.0 中还推出了新的任务并行库(TPL),也是一种新异步模式:

《任务并行库》

最后,.net 4.5 又推出了全新的 async 和 await 关键字:

《C#与Visual Basic的未来(上)》

《C#与Visual Basic的未来(中)》

《C#与Visual Basic的未来(下)》 

最后,在这几篇文章的基础上,想和大家谈谈 async 和 await 在 Web 下的应用,包括 WebFormMVC

利用手机,为你的相机照片加上地理位置标记

现在智能手机上的相机都有一个功能:地理位置标记

加上这个标记后,在 Pisaca ,Flickr 等软件&相册中,就可以看到图片所在的地理位置了,还可以看到自己的轨迹,体验非常好!

但是谁旅游会拿个手机拍照呢?

可是谁家的数码相机又会有 GPS 呢?(别那么早下定论,还真有几款数码相机有 GPS)

 

后来,偶然看到一款国内的软件,叫遨游记,它的核心技术就是:

用手机来记录一组 GPS 位置信息,然后相机拍照;然后在电脑上把这两组数据根据时间匹配。这样每张照片都可以找到一个当时所谓位置的信息了。

非常棒的创意!(后来发现其实早有人实现了)

可惜只有 iPhone 版,没有 Android 版本…

 

那 Android 版如何实现呢?

其实仔细想想,这里就涉及到2个技术:

  1. 记录位置信息
  2. 把位置信息写入照片

后来我还真把这两个软件找齐了,最终实现了这个功能!

disabled 和 readonly 总结

问题重现

前段时间做网站遇到了一点纠结事,在下面两个场景出现了问题:

 

disabled 和 readonly 的提交问题

有一个 text 类型的 input,用户无法直接提交内容,但是 js 会自动根据别的一些表单修改其中的内容。

也就是说,它的内容也是要被提交到后端的。

首先,当我把这个 input 设置成 disabled 后竟然在 post 的时候就不提交了!

后来搜索之,原来通过用 readonly 后就可以提交了,难道这么快就解决了?

于是,我就 happy 地签入了… 然后 QA 就来找我麻烦了… T.T

又是哪里出问题了呢?前面的问题是 html 和浏览器的标准决定的,在这方面已经解决了。但是为什么提交后,后端表单明明接收到了却还是出问题了呢?

巧用Windows下的搜索实现快速启动程序

怎么快速启动程序?

有的人喜欢像 MAC 下的启动方式,现在的 Win7 时代呢,完全可以把程序 Pin 在任务栏上,可以达到一样的效果。

但是这种方式有局限性,不能搜索所有的程序,而且也不能搜索文档之类的东西,如果你有大量的文档也想一起搜索怎么办?

 

为了解决这个问题,就有了如下两个软件:

首先是 小Q书桌,360等都有类似的软件,大家根据洗好自我选择。

qdesk

短函数的优点

函数最初的用处

大家刚学编程的时候,一定还记得为什么要用函数。那就是把重复的代码归纳到一个函数中多次利用。这点毋庸置疑,大家也用的很熟了,但是除了这个还有什么改进空间吗?答案肯定是有的!

PS.本文不讨论面向对象、不讨论设计模式,只是把视线聚焦在 Class 内部的函数上。

 

出现什么问题了?

大家都知道当一个函数很长的时候,就会造成阅读困难,那以前我们都是怎么解决的呢?

  1. 写注释:这个大家都知道怎么用,也是一种有效的方法。
  2. 用 #region 代码块:这个也是一个行之有效的方法。

还有什么别的方法吗?其实还有一个方法就是文章的标题:使用短函数。

在讨论短函数有点之前,我想先用一点篇幅来讲述一下什么时候改写注释。

路人甲:纳尼?不是说任何时候都要写注释吗?

2011年读书总结

新年快乐

祝大家新年快乐,趁着2011还没过去,赶快把今年的读书总结写了,其实也是我第一年写这个。

这一年,在这块真的收获很大,所以很有必要来一个总结。

 

2011年读过的书——技术类

《More Effective C#》

More Effective C#

这是一本难得的好书,一个个知识点相对独立,没有多少以来关系,所以看一点就能学一点。

看完这本书,给人的感觉非常满足!作者提出的一些观点非常有用,思路严谨,不是一般人能写出来的,非常佩服!

推荐指数:★★★★☆

那些 WebForm 可以从 MVC 借鉴的东西 —— Ajax

MVC 的优雅

用过 MVC 中局部更新的同学肯定会觉得其中的写法真的是非常的优雅:

public ActionResult Index()
{
    var data = UserService.GetUserList();
    if (Request.IsAjaxRequest())
    {
        return PartialView("UserList", data);
    }
    else
    {
        return View(data);
    }
}

如果在页面上加上一个刷新按钮后,第一次显示就能读取到这个 PartialView 的内容,点即刷新后就可以刷新页面。

这里的读取逻辑本应该是一样的,应该是写在同一个地方的,MVC 做到了这一点。

关于一个2.0下实现扩展方法所引发的错误

错误产生环境及非完美解决办法

错误提示:缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor”

这个错误真的非常诡异,因为双击这个错误的时候无法定位到出错的地方。

而且这个错误实在是非常不明确。

其实,产生这个错误的人大部分是因为引用了 Newtonsoft.Json.Net20.dll 这个类库。

网上简单的解决方式是:“删除 Newtonsoft.Json.Net20.dll 后重新引用”

用好 Google.com

墙内墙外

GFW现在真的是越来越过分了,以前用 Google 搜索,只不过是会屏蔽关键字,现在正常情况下也会经常上不去!

本文将介绍几个小技巧,让你更舒适地使用 Google 搜索

 

用好 Google.com 而不是 Google.com.hk

话说这两个有区别吗?看上去只是 Google 在不同国家设定一个网站镜像,使用的数据不应该是一样的嘛?

其实整体来说是差不多的,但是 Google.com 是美国的镜像,各国的法律不同,相对来说 Google.com 更宽松一点,所以可以在上面搜索到更多的东西!

另外,Google.com 上面的功能也会有点不一样,例如 Google Instant 这个功能也只有在 Google.com 上能体验了。

总之,如果你喜欢原汁原味的 Google.com 就一起来设置吧~

把 ref 和 out 关键字说透

ref 和 out 的区别

网上有很多这方面的文章,但是大部分人总是纠结于他们在原理上的那一点点细微的区别,所以导致了难以区分它们,也不知道什么时候改用哪一个了。

但是如果从试用场景的角度对它们进行区别的话,以后你一定不会再纠结了。

当你明白它们的适用场景后,再去扣其中的原理,使用中的一些问题也就迎刃而解了~

 

简单的来说,它们的区别在于:

ref 关键字 是作用是把一个变量的引用传入函数,和 C/C++ 中的指针几乎一样,就是传入了这个变量的栈指针。

out 关键字 的作用是当你需要返回多个变量的时候,可以把一个变量加上 out 关键字,并在函数内对它赋值,以实现返回多个变量。

大内存有大用处

现在的内存啊,主流都是4G,两根4G的DDR3 1333内存也才300元,150就可以买一根了~真是白菜价啊~

但是,大内存真的好吗?如何利用这些内存呢?

本文适用于内存大于等于4G的用户,小于这个容量的仅限观摩,另外,本文只做一定的引导,具体的步骤可以自行搜索,因为真的很简单。

 

大内存如何设置虚拟内存

虚拟内存有什么用就不用介绍了,在内存足够的情况下,当然是不设置虚拟内存最好。就算你是8G的内存,也会把内存用完哦!

2个虚拟机+Visual Studi 2010+PhotoShop CS5,这样肯定把内存用完了,而这种情况在开发中也是可能用到的,当然有点夸张了。

我建议:如果你的内存大于等于4G,你可以先把虚拟内存关闭。然后,如果日常中出现内存不足的情况,再打开虚拟内存,并且可以慢慢增加,直到日常使用中不出现内存不足为止,注意啊,是正常的,不要搞极端!

技术人如何提升自己

好久没写博客了,从八月底开始一直忙着找招聘、实习、回校、找租房等事情…

这篇文章一直在想,心中有所想,但是总是无法组织起来。或许只有真正开始写了,才能完整的组织起来把。

所以,就这样动“笔”了!由于没有完整的组织架构,我想先通过一些思维片段来表达我自己的观点。或许,大家看着看着就有收获了;亦或许,我写着写着就有灵感了~

顺便也说一件高兴的事,非常荣幸能进入大众点评技术部实习,这篇文章正是在找实习和面试的过程中构思起来的。

 

技术人如何提升自己?

先说明一下,本文所谓的提升暂时只关注技术层面。对自己的提升还有很多方面,本文暂时先不说了~

关于技术层面的提升,我先总结了自己的一些经验。为了知己知彼,也关注和思考了关于“企业喜欢什么样的人”的问题。

最终总结出了本文,所以本文的完整标题应该是:在技术层面,企业喜欢怎么样的人才?我们又该如何地提升自己?

不继承 IEnumerable 或 IQueryable 的类型怎么使用 LINQ 查询

最近想研究如何自定义 LINQ Provider ,但是一直无法入手,先写点收获吧~

MSDN 上的这篇文章(《启用数据源以进行 LINQ 查询》)中写到:

如果想对自己的数据源进行 LINQ 查询,那必须使用一下四种方法的其中一种。

  1. 实现 IEnumerable 接口
  2. 实现标准的查询方法
  3. 实现 IQueryable 接口
  4. 扩展已经实现的 LINQ 查询

看到其中第二条,让人心生疑惑,那下面就来探讨一下吧~

 

什么类型可以进行 LINQ 查询?

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;

很简单的几行代码,这就是 LINQ,这里有几个关键字: from, in, where, select …

这几个是新增的关键字,还有别的好多个~

关键看这里的 customers ,这里就是一个可以被 LINQ 查询的对象。

理解 .Net 中的各种“相等”关系 - Part2

实例的 Equals() 方法

在讨论这个函数之前,你必须明确一下在数学中的相等关系代表着什么。你需要确保你定义的和别人理解的是相一致的。

数学中的相等关系是 自反的、对称的和可传递的

  • a == a //自反性
  • if a==b then b==a //对称性
  • if a==b && b==c then a==c //传递性

 

如果你不自定义实例的 Equals() 函数会发生什么:

引用类型 判断的是它们之间身份的统一性,和 Object.ReferenceEquals() 等效,因为如果你不重写的话,它实际上调用的是 Object.Equals() 方法。

注意:这里的 Object.Equals() 方法并不是静态的 Object.Equals() 方法,它们传递的参数不同。

前者是:Equals(object obj),后者是:Equals(object objA, object objB)

值类型 是不是也是这样呢?如果是的话,那么值类型的 Equals() 方法永远是 false 了,其实不然,值类型的 Equals() 比较的是它们的值是否相同,而不是引用。

注意:为什么会这样呢?因为所有的值类型不是直接继承 Object 的,而是继承了 ValueType ,而这个类重写了 Equals() 方法。

理解 .Net 中的各种“相等”关系 - Part1

申明

原文为《Effective C#》中内容,作者为 Addison Wesley

仅做翻译和修改(原文太长太罗嗦),但并不修改作者的原意。

 

C# 中的相等关系

当你定义了一个自己的类型后,你需要明确一下“相等”关系对你的类型来说意味着什么。

你可以使用 C# 提供的四种方法来判断他们是否相等。

public static bool ReferenceEquals(object left, object right);
public static bool Equals(object left, object right);
public virtual bool Equals(object right);
public static bool operator ==(MyClass left, MyClass right);

前两个是 Object 的静态方法,第三个是实例的方法,最后一个是 == 操作符。

变成语言允许你自定义这四个方法,但是并不提倡。前两个一定不要碰;实例的 Equals() 方法需要经常重写;== 操作符偶尔需要重写,特别是当考虑到值类型性能的时候。

除此以外,在这四个方法之间也有一定的联系,当你修改其中一个的时候也会影响到另外的几个。

推荐一款 WYSIWYG 编辑器 —— xhEditor

什么是 WYSIWYG?

所见即所得英语What You See Is What You Get,简称WYSIWYG)是一种电脑方面的技术,它使得人们可以在屏幕上直接正确地得到即将打印到纸张上的效果。故也称可视化操作。今日此项技术通常是文书处理系统所必需的(TeX例外),但对于其他文档来说却不一定,例如HTML。WYSIWYG是由菲利普威尔逊 (Flip Wilson) 所提出。

From:维基百科

 

xhEditor

关于类似的工具,可以看一下我的另一篇文章:如何使用网页上的富文本编辑器

基本功能不多介绍了,这里就介绍几个比别的工具更优秀的地方

利用 bat 文件制作 HOSTS 快速切换器

切换 HOSTS 文件的困扰

学校里的 IPV6 免费上,而 IPV6 下是不用翻墙的,但是有但是 IPV6 下,有一些网站虽然有 IPV6 的 IP 但是却没有域名… 所以也只能通过修改 HOSTS 文件来访问。

另外在 IPV4 下,Google 的许多服务都需要通过修改 HOSTS 文件后才能正常访问…

所以,在平时每天需要切换好几次 HOSTS 文件。

那有什么办法可以简化这个操作?

Android系统中电子邮件的解决方案

纠结的电子邮件使用体验

在使用电子邮件的时候出现了种种问题:

  • Android 中的 Gmail 客户端非常棒!还支持推送~ 但是 Gmail 在电脑上常常被重置,这个大家懂的…
  • Android 中的 邮件客户端 使用 QQ邮箱 的时候,会出现一些问题,倒是用户体验极差
  • Android 上找不到好的邮件客户端

 

QQ邮箱的问题:

QQ邮箱在 IMAP协议 的支持上会导致一些问题。

标准的 IMAP 中,垃圾箱叫 Trash,已发送邮件叫 Sent ,但是 QQ邮箱 中却不是这个名字。

所以在 Android的邮件客户端 中设置 QQ邮箱 后,删除邮件或者发送邮件以后,就会自动创建上述文件夹,而不会放到 QQ邮箱 的“已删除邮件” 和 “以发送邮件” 中…