簡體   English   中英

創建多個線程並等待它們全部完成,然后再次調用該線程

[英]Create multiple threads and wait for them all to complete, calling again for the complete

我有一個Web服務,可以為本地數據庫加載數據庫服務器,並發出100個記錄請求。

由於該過程很慢,因此我想創建10個線程,而不要使用過多的內存來進行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

您正在關閉循環變量。 您需要記住,lambda關閉的是變量而不是 在lambda執行 iterator + page * 10 時,您的任務將各自讀取iterator的值。 到發生這種情況時,主線程已將其增加到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);                        
    });
}

如果我理解您的問題,則要創建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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM