在本次课程中,我学习到了异步编程(C# 5.0 async/await)、HttpClient以及在作业中自己学到的json序列化/反序列化和对xml文件进行访问读取操作。接下来我会结合上课学到的内容和作业中的使用到的内容讲述一下我的学习。
一、异步编程(C#5.0 async/await)
一个异步过程调用发出后,调用者不能立刻得到结果。基于事件机制,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如,现在又一批数据要存入库,当我们不希望入库时要等待过程时间来返回结果,就可以使用异步编程方法,讲着一批数据存入一个队列,用另一个线程来操作这个队列里的数据入库,入库完成后通知主线程。在另一个线程入库时,主线程可用来做其他事件。
在async/await中,async关键字用于方法名处,await放在有async关键字声明的方法内。对于只标识async关键字的(指在方法内没有出现await关键字)的方法,调用线程会把该方法当成同步方法一样执行,所以此种情况下不会赌赛GUI线程,只有当async和await关键字同时出现时,该方法才会被转换为异步方法处理。这种使用的好处在于:在await关键字出现的前面部分代码和后面部分代码都是同步执行的(即在调用线程上执行的,也就是GUI线程,所以不存在跨线程访问控件的问题),await关键字处的代码段是在线程池线程上执行。总结为:使用async和await关键字实现的异步方法,此时的异步方法被分成了多个代码片段去执行的。
例如我在作业中写到的一段代码:
public async void translateFWeather(string code)
{
string uri = "http://m.weather.com.cn/data/" + code + ".html";
HttpClient client = new HttpClient();
string body = await client.GetStringAsync(uri);
WeatherInfoF w = (WeatherInfoF)JsonConvert.DeserializeObject(body,typeof(WeatherInfo));
PrintWeather pw = new PrintWeather();
pw.printFWeather(w);
}
这段代码中,用HittpClient中的方法将网址中的全部内容转换为string类型body,在这过程中,使用await关键字使用异步方法,在等待获取网址中内容时,可异步执行后续语句。HttpClient用来接收HttpResponeseMessages和发送HttpRequestMessages的主要类。在此处用来接收网址的内容,传给body。
另外,在这段代码中还用到了Json的反序列化,将从网址中获取到的内容用Json反序列化存入WeatherInfoF类中。
在这次作业中用到的对xml文件的访问读取代码如下:
<pre name="code" class="csharp"><span style="white-space:pre"> </span> XmlDocument xml = new XmlDocument();
xml.Load(@"E:\cityCode.xml");
List<CityCode> list = new List<CityCode>();
string cityCode = "";
string cityName = "";
CityCode cc = null;
foreach (XmlNode node in xml.ChildNodes)
{
if (node.Name == "citylist")
{
foreach (XmlNode subNode1 in node.ChildNodes)
{
if (subNode1.Name == "city")
{
foreach (XmlNode subNode2 in subNode1.ChildNodes)
{
switch (subNode2.Name)
{
case "name":
cityName = subNode2.InnerText;
break;
case "code":
cityCode = subNode2.InnerText;
break;
}
}
cc = new CityCode(cityName,cityCode);
list.Add(cc);
}
}
}
打开cityCode.xml文件,为了搜寻相应城市名称对应的城市代码,用嵌套foreach循环将xml文件中每个城市信息存入列表list中,在后续需要的时候进行合适的操作选取。
我认为这次作业中的三个难点就在此处。通过这次作业的学习,我相信让我对C#的学习又深入了一步。