伪代码如下
foreach (var tag in tags)
{
//var tagCake = tag
ThTask.Task.Factory.StartNew(() =>{
var dataT = fetchDataFromNetwork(tag);
//do something with dataT
}
}
发现每个不同的tag,获取的数据dataT都是一样的,并且fetchDataFromNetwork方法也已经进行同步访问处理。试着用ILSpy看了下编译后的代码。
<>c_DispalyAClassf这个是编译后自动生成的对象,可以看到,每个循环中,都是调用的同一个<>c_DispalyAClassf.<btn_fetch_click>b_9。
参考多线程匿名函数使用局部变量导致的:bughttp://www.cnblogs.com/1-2-3/archive/2009/03/16/thread-anonymous-method.html,进行修改,
foreach (var tag in tags)
{
var tagCake = tag
ThTask.Task.Factory.StartNew(() =>{
var dataT = fetchDataFromNetwork(tagCake);
//do something with dataT
}
}
可以看到如下图变化:
之后,运行正常
本文解决了一个多线程并发环境下抓取不同标签数据的问题,原本所有线程获取到相同数据,通过合理使用局部变量实现了正确数据抓取。
741

被折叠的 条评论
为什么被折叠?



