为什么异步CTP性能不好?我真的不明白为什么await和async没有像我们想象的那样提高我的代码的性能。虽然持怀疑态度,但我认为编译器应该重写我的方法,以便并行完成下载……但这似乎并没有真正发生。(我确实意识到await和async不会创建单独的线程;但是,操作系统应该并行下载,并在原始线程中回调我的代码-不应该吗?)我是否错误地使用了async和await?使用它们的正确方法是什么?代码:使用系统;使用System.Net;使用系统线程;使用System.Threading.Tasks;静态类程序{staticintSumPageSizesSync(string[]uris){inttotal=0;varwc=newWebClient();foreach(varuriinuris){total+=wc.DownloadData(uri).Length;Console.WriteLine("收到同步数据...");}返回总数;}staticasyncTaskSumPageSizesAsync(string[]uris){inttotal=0;varwc=newWebClient();foreach(varuriinuris){vardata=awaitwc.DownloadDataTaskAsync(uri);Console.WriteLine("收到异步CTP数据...");总计+=数据.长度;}返回总数;}staticintSumPageSizesManual(string[]uris){inttotal=0;int剩余=0;foreach(varuriinuris){Interlocked.Increment(refremaining);varwc=newWebClient();wc.DownloadDataCompleted+=(s,e)=>{Console.WriteLine("接收编辑手动异步数据...");Interlocked.Add(reftotal,e.Result.Length);Interlocked.Decrement(refremaining);};wc.DownloadDataAsync(newUri(uri));}while(remaining>0){Thread.Sleep(25);}returntotal;}staticvoidMain(string[]args){varuris=newstring[]{//刚发现一个慢速站点,来演示问题:)"http://www.europeanchamber.com.cn/view/home,"http://www.europeanchamber.com.cn/view/home","http://www.europeanchamber.com.cn/view/home","http://www.europeanchamber.com.cn/view/home","http://www.europeanchamber.com.cn/view/home",};{varstart=Environment.TickCount;SumPageSizesSync(uris);Console.WriteLine("同步:{0}毫秒",Environment.TickCount-开始);}{varstart=Environment.TickCount;SumPageSizesManual(uris);Console.WriteLine("手动:{0}毫秒",Environment.TickCount-开始);}{varstart=Environment.TickCount;SumPageSizesAsync(uris).Wait();Console.WriteLine("异步CTP:{0}毫秒",Environment.TickCount-开始);}}}输出:接收到同步数据...接收到同步数据...接收到同步数据...接收到同步数据...接收到同步数据...同步:14336毫秒手动接收异步数据...手动接收异步数据...手动接收异步数据...手动接收异步数据...手动接收异步数据...手动:8627毫秒//几乎快两倍...接收异步CTP数据...收到异步CTP数据...收到异步CTP数据...收到异步CTP数据...收到异步CTP数据...异步CTP:13073毫秒//为什么这么慢??克里斯的回答几乎是正确的,但引入了竞争条件并同步阻止所有任务作为一般规则,如果您有等待/异步可用,最好不要使用任务延续。另外,不要使用WaitAny/WaitAll-异步等价物是WhenAny和WhenAll。我会这样写:staticasyncTaskSumPageSizesAsync(IEnumerableuris){//为每次下载启动一个任务。var任务=uris。Select(uri=>newWebClient().DownloadDataTaskAsync(uri));//异步等待它们全部完成.varresults=awaitTaskEx.WhenAll(tasks);//计算总和.returnresults.Sum(result=>result.Length);我可能误读了你的代码,但看起来你正在启动一个后台线程来执行异步读取,然后立即阻塞,等待它完成。关于代码的“异步”部分,它实际上并不是异步的。试试这个:staticasyncTaskSumPageSizesAsync(string[]uris){inttotal=0;varwc=newWebClient();vartasks=newList>();foreach(varuriinuris){tasks.Add(wc.DownloadDataTaskAsync(uri).ContinueWith(()=>{total+=data.Length;}));}Task.WaitAll(任务);返回总计;}并使用这个:{varstart=Environment.TickCount;等待SumPageSizesAsync(uris);Console.WriteLine("异步CTP:{0}毫秒",Environment.TickCount-开始);我可能是错的-异步的东西是新的,我不是100%熟悉它-但同步版本Similartimes似乎让我失望。以上是C#学习教程:为什么异步CTP性能差?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
