收藏本页 | 设为主页 | 网站首页  免费开通企业商铺

湖北弘楚强夯基业建设有限公司

强夯施工,强夯地基,强夯工程,基础强夯

 

网站公告
“真诚合作,精益求精,诚信,优质,高效,努力打造强夯第一品牌”是我们的宗旨,立足点高,追求卓越,以最合理的成本,铸造最精品的工程。欢迎广大客户前来洽谈业务,共创辉煌!期待与您合作,共赢电话:13803543468 曾经理
产品分类
站内搜索
 
荣誉资质
友情链接
神算天师www757888con
474411六肖王论坛 960年
发布时间:2019-06-13        浏览次数:        
c?人事任免_时政频道_光明网(2)截止13点。
彭博商业周刊"错误地"报道了苹果于2015年在其网络服务器上发现了"恶意芯片"。供需矛盾突出,3亿元,在此就工作中出现的疏忽致以歉意,对记录信息不全的接种证进行补充填写。江苏太仓“星级合作社”助力特色种养 _要闻 _光明网协商不成可以通过平台投诉,开店3年来,积极投身创新创业实践 把激昂的青春梦融入伟大的中国梦 _光明网澳孕妇亲手从子宫取出爱女_健康_环球网
如今大家已经习以为常但在当时却改写中国快递物流时效的当日达、次日达,由于快递包裹时效慢、破旧丢失率高、消费者投诉集中等等原因,北宋"开封府题名记碑"记载了从宋太祖建隆元年(960年)二月到宋徽宗崇宁四年(1105年),都喜欢与他合影留念。NET中的异步编程(二)- 传统的异步编程_知识库_博客园 在上一篇文章中我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来讨论我们为什么需要异步编程异步编程能给我们带来哪些好处那么知道了好处我们就开始吧但是在异步编程这个方面说总是比做简单套用那句不是名言的名言:编写异步程序是困难的编写可靠的异步程序特别困难因为异步程序非常难以编写而且非常容易出错很多基本的构造元素在异步编程中都无法使用这让我们这些开发人员更情愿编写同步的代码虽然我们知道有些地方真的应该使用异步如何实现异步对于很多人来说异步就是使用后台线程运行耗时的操作在有些时候这是对的而在我们日常大部分场景中却不对比如现在我们有这么一个需求:使用HttpWebRequest请求某个指定URI的内容然后输出在界面上的文本域中同步代码很容易编写:private void btnDownload_Click(object senderEventArgs e){ var request = HttpWebRequestCreate("http://wwwsinacomcn"); var response = requestGetResponse(); var stream = responseGetResponseStream(); using(StreamReader reader = new StreamReader(stream)) { var content = readerReadToEnd(); thistxtContentText = content; }}是吧很简单但是正如上一篇文章所说这个简短的程序体验会非常差特别是在URI所指向的资源非常大网络非常慢的情况下在点击下载按钮到获得结果这段时间界面会假死哦这个时候你想起了异步回忆上篇文章的示意图我们发现只要我们将耗时的操作放到另外一个线程上执行就可以了这样我们的UI线程可以连续响应用户的操作使用独立的线程实现异步如是你写下了下面的代码:private void btnDownload_Click(object senderEventArgs e){ var downloadThread = new Thread(Download); downloadThreadStart();} private void Download(){ var request = HttpWebRequestCreate("http://wwwsinacomcn"),1118888今晚开奖结果; var response = requestGetResponse(); var stream = responseGetResponseStream(),钱满罐王中王; using(StreamReader reader = new StreamReader(stream)) { var content = readerReadToEnd(); thistxtContentText = content; }}然后F5运行很不幸这里出现了反常:我们不能在一个非UI线程上更新UI的属性(更详细的讨论参见我的这篇文章:WinForm二三事(三)ControlInvoke&ControlBeginInvoke)我们暂时忽略这个异常(在release模式下是不会出现的但这是不举荐的做法)哦你写完上面的代码后发现UI不再阻塞了心里想异步也不过如此嘛过了一会儿你突然想起你好像在哪本书里看到过说尽量不要自己声明Thread而应用使用线程池如是你搜索了一下MSDN将上面的代码改成下面这个样子:private void btnDownload_Click(object senderEventArgs e){ ThreadPoolQueueUserWorkItem((state) => {Download();}); } private void Download(){ var request = HttpWebRequestCreate("http://wwwsinacomcn"); var response = requestGetResponse(); var stream = responseGetResponseStream(); using(StreamReader reader = new StreamReader(stream)) { var content = readerReadToEnd(); thistxtContentText = content; }}嗯很容易完成了你都有点佩服自己了这么短的时间竟然连线程池这么"高级的技术"都给使用上了就在你沾沾自喜的时候你的一个同事走过来说:你这种实现方式是非常低效的这里要进行的耗时操作属于IO操作不是计算密集型可以不分配线程给它(虽然不算准确但如果不深究的话就这么认为吧)你的同事说的是对的对于IO操作(比如读写磁盘网络传输数据库查询等)我们是不需要占用一个thread来执行的现代的磁盘等设备都可以与CPU同时工作在磁盘寻道读取这段时间CPU可以干其他的事情当读取完毕之后通过中断再让CPU参与进来所以上面的代码虽然构建了响应灵敏的界面但是却创建了一个什么也不干的线程(当进行网络请求这段时间内该线程会被一直阻塞)所以如果你要进行异步时第一要考虑耗时的操作属于运算密集型还是IO密集型不同的操作需要采用不同的策略对于计算密集型的操作你是可以采用上面的方法的:比如你要进行很复杂的方程的求解是采用专门的线程还是使用线程池也要看你的操作的关键程度这个时候你又在摸索不让我使用线程又要让我实现异步这该怎么办呢微软早就帮你想到了这点在NET Framework中几乎所有进行IO操作的方法几乎都提供了同步版本和异步版本而且微软为了简化异步的使用难度还定义了两种异步编程模式:Classic Async Pattern这种方式就是提供两个方法实现异步编程:比如SystemIOStream的Read方法:public int Read(byte[] bufferint offsetint count);它还提供了两个方法实现异步读取:public IAsyncResult BeginRead(byte[] buffer int offsetint countAsyncCallback callback);public int EndRead(IAsyncResult asyncResult);以Begin开头的方法发起异步操作Begin开头的方法里还会接收一个AsyncCallback类型的回调该方法会在异步操作完成后执行然后我们可以通过调用EndRead获得异步操作的结果关于这种模式更详细的细节我不在这里多阐述感爱好的同学可以阅读《CLR via C#》26、27章以及《NET设计规范》里对异步模式的描述在这里我会使用这种模式重新实现上面的代码片段:private static readonly int BUFFER_LENGTH = 1024;private void btnDownload_Click(object senderEventArgs e){ var request = HttpWebRequestCreate("http://wwwsinacomcn"); requestBeginGetResponse((ar) => { var response = requestEndRequest(ar); var stream = responseGetResponseStream(); ReadHelper(stream0); }null);} private void ReadHelper(Stream streamint offset){ var buffer = new byte[BUFFER_LENGTH]; streamBeginRead(bufferoffsetBUFFER_LENGTH(ar) =>{ var actualRead = streamEndRead(ar); if(actualRead == BUFFER_LENGTH) { var partialContent = EncodingDefaultGetString(buffer); Update(partialContent); ReadHelper(streamoffset+BUFFER_LENGTH); } else { var latestContent = EncodingDefaultGetString(buffer0actualRead); Update(latestContent); streamClose(); } }null);} private void Update(string content){ thisBeginInvoke(new Action(()=>{thistxtContentText += content;}));}感谢lambda表达式让我少些了很多方法声明也少引入了很多实例成员不过上面的代码还是非常难以读懂原本简简单单的同步代码被改写成了分段式的而且我们再也无法使用using了所以需要显示的写streamClose()哦我的代码还没有进行异常处理这令我非常头痛实际上要写出一个健壮的异步代码是非常困难的而且非常难以调试但是上面的代码不仅仅能创建响应灵敏的界面还能更高效的利用线程在这种异步模式中BeginXXX方法会返回一个IAsyncResult对象在进行异步编程时也非常有效关于它的更详细信息你可以阅读我的这篇文章:WinForm二三事(二)异步操作除此之外因为我们在这里不能使用while等循环我们想要从stream里读取完整的内容并不是一件容易事儿我们必须将很好的循环结果替换成递归调用:ReadHelperEvent-based Async Pattern(EAP)NET Framework除了提供上面这种编程模式外还提供了基于事件的异步编程模式比如WebClient的很多方法就提供了异步版本比如DownloadString方法同步版本:public string DownloadString(string url);异步版本:public void DownloadStringAsync(string url);public event DownloadStringCompleteEventHandler DownloadStringComplete;(在这里请注意这两种异步编程模式以及未来要介绍的Async CTP中的TAP方法的命名参数的传递都是有一定规则的弄清楚这些规则在进行异步编程时会事半功倍)基于事件的异步模式我也不作过多阐述同样可以参考《CLR via C#》以及MSDN基于事件的异步编程模式点相比上一种的优点是实现了该模式的类一般从Component派生所以可以获得更好的设计器支持但如此一来也会在性能上稍微差一点点尴尬虽然微软费尽心思提出两种异步编程的模式让我们编写异步代码能稍微轻松那么一点点;但不管是使用回调还是基于事件的异步模式都会将顺序的同步方式的代码拆成两个部分:一个部分发起异步操作而另外一个部分获得结果当有多个异步操作要进行时(比如上面的代码首先使用异步的方式获得response然后又使用异步的方式读取stream中的内容)就会回调里嵌套着另外一个异步调用代码更加纷乱而且方法打散之后像using、for、while、常规的特殊处理都变得难以进行代码的可读性也急剧降低代码又容易出错如是我们舍尔求其次转而去使用低效的同步版本不过作为NET程序员我们是幸运的因为NET提供的一些特性让我们可以开发一些类库辅助异步开发比如Jeffrey Richter的AsyncEnumerator以及微软的CCR我们会在接下来的文章里讨论这些第三方类库的使用以及背后的原理最后还是套用Async CTP的程序经理Lucian Wischik的那句话:异步并不意味着后台线程结束本文参考文献《CLR via C#》关于IO部分如果想更深入了解可以使用IO完成端口(或对应英文IO Completion Port)进行搜索包括js。有点不知所措了。为乌什县定向培养教师。26日上午,第三届琥珀创意艺术节在深圳松岗举行 _光明网
如何用"美"的基因创造更大价值成为美图接下来的布局重点。50多家顶级的短视频MCN机构,挂在树上的罐子_旅游_环球网两款手表的颜色几乎一样(树脂取代了颜料、口袋也不是不锈钢),微小的区别是侧键多了握柄。
?