C#的新特性体验(异步方法的同步调用)
异步编程出现已经很早了,微软在silverlight中的(RIA Service)将这个发挥到了极致,其实就是只提供异步远程服务调用,说起来也是非常美好的事情,但实际上却未必如此美好,因为很多应用,特别是带有业务性质的,都需要一定程度上的同步,在这种情况下如果用异步编程就会非常的复杂,需要用异步模拟同步,这个工作量是非常大的,特别是在业务逻辑比较复杂的情况下,需要调用一系列异步方法来组合,而调用在业务上要求有先后的情况下,就是一个灾难,非常复杂,而且代码的可读性和维护性极差(用silverlight做过企业应用的应该能体会那种痛苦),当然异步编程由于其处理方式比起同步编程来讲,对程序员的要求要高很多.微软显然是认识到了这个问题,于是在新的C#版本中弄出了async和await关键字,来简化异步下的同步模拟,下面的代码是我进行测试的代码(抄CSDN今天头条中异步编程中的):
[csharp]
private static async Task<string> GetContent(string url)
{
WebRequest wr = WebRequest.Create(url);
//var rsp = wr.GetResponse();
//var stm1 = rsp.GetResponseStream();
var response = await wr.GetResponseAsync();
using (var stm = response.GetResponseStream())
{
using (var reader = new StreamReader(stm))
{
//var content = reader.ReadToEnd();
var content = await reader.ReadToEndAsync();
return content;
}
}
}
private static async Task<string> GetContent(string url)
{
WebRequest wr = WebRequest.Create(url);
//var rsp = wr.GetResponse();
//var stm1 = rsp.GetResponseStream();
var response = await wr.GetResponseAsync();
using (var stm = response.GetResponseStream())
{
using (var reader = new StreamReader(stm))
{
//var content = reader.ReadToEnd();
var content = await reader.ReadToEndAsync();
return content;
}
}
}
UI线程下调用代码如下:
[csharp]
var theRet = GetContent("http://www.zzzyk.com/kf/201203/125486.html ");
MessageBox.Show(theRet.Result);
var theRet = GetContent("http://www.zzzyk.com/kf/201203/125486.html ");
MessageBox.Show(theRet.Result);
await关键字是表示等待后面异步调用可用,起到异步转同步的作用,调试时也确实在await语句时被挂起了,其实界面无法做任何事情,这就跟同步调用没什么区别了,至少效果上一样的,因此如果遇到这种需求,其实没必要采用这种异步转同步的方式处理,直接同步调用就OK.
坦率的讲,上面的代码我没有调试到结果,我用同步的方法很快就得到了结果,而用上述方法,就在var response = await wr.GetResponseAsync();语句时假死了,等了很久也没有响应,所以就直接结束调式了,那位兄弟测试后可以得到结果的,麻烦告诉一下我,好找找原因.是我人品问题还是我的VS2011库有问题,或者其它.
另外,CSDN的头条异步编程其实是个噱头,应该是C#5.0提供了异步方法同步调用的支持.
PS:异步编程还是需要的,但要看地方.什么事情做得太偏激都不好.
摘自 hawksoft
补充:软件开发 , C# ,