伪代码如下
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
}
}
可以看到如下图变化:
之后,运行正常