我有一个Web服务,为本地数据库加载数据库服务器,发出100条记录请求。
由于进程很慢,我想创建十个线程,不要使用太多内存,进行Web Service调用,当其中一个线程完成时,超过100个调用记录。如何部分线程?
示例:
创建线程1 创建线程2 创建线程3 创建线程4
主题1再次完成更改Web服务
我的代码无效。变量send
总是得到值10而不是0,1,2,3,4等等。
Int32 page = 0;
do
{
for (int iterator=0; iterator < 10; iterator++)
{
listTask[iterator] = Task.Factory.StartNew(() =>
{
Int32 send = iterator + page * 10;
DoStatus("Page: " + send.ToString());
Processamento(parametros, filial, send);
});
}
Task.WaitAll(listTask);
page++;
}
while (true); // Test only
答案 0 :(得分:2)
你正在关闭循环变量。你需要记住,lambdas靠近变量而不是值。您的任务将在lambda执行 iterator
时读取iterator + page * 10
的值。当发生这种情况时,主线程已经将其增加到10
。
这很容易解决。在for
循环中复制循环变量,以便闭包关闭 变量,该变量永远不会改变。
for (int iterator=0; iterator < 10; iterator++)
{
int i = iterator;
listTask[iterator] = Task.Factory.StartNew(() =>
{
Int32 send = i + page * 10;
DoStatus("Page: " + send.ToString());
Processamento(parametros, filial, send);
});
}
答案 1 :(得分:1)
如果我理解你的问题,你想创建10个线程,等待所有,然后重新创建10个线程,等等。每个线程加载100个结果。
在这个答案中,结果是String
,但可以更改。
private void Load()
{
Boolean loading = true;
List<String> listResult = new List<String>();
Int32 boucle = 0;
Task[] listTask = new Task[10];
do
{
// create 10 threads (=1000 results)
for (int iterator=0; iterator < 10; iterator++)
{
// [0-99] [100-199] [200-299] ...
Int32 start = 100 * iterator + 1000 * boucle;
Int32 end = start + 99;
listTask[iterator] = Task<List<String>>.Factory.StartNew(() =>
{
List<String> data = LoadData(start, end);
return data;
});
}
// wait for 10 threads to finish
Task.WaitAll(listTask);
// collapse results
for (int i=0; i < 10; i++)
{
listResult.AddRange((listTask[i] as Task<List<String>>).Result);
}
// check if there is 100 results in last thread
loading = (listTask[9] as Task<List<String>>).Result.Count == 100;
// ready for another iteration (next 1000 results)
boucle++;
}
while (loading);
}
private List<string> LoadData(int p1, int p2)
{
// TODO : load data from p1 to p2
throw new NotImplementedException();
}