-1

次のコードを書きました。そこで、ItmTh と RelTh の 2 つのスレッドを作成しました。最初に ItmTh スレッドを実行し、ItmTh スレッドが実行を終了したら、RelTh スレッドを実行する必要があります。どのような解決策がありますか?

`

                string[] filePaths = Directory.GetFiles(folderPath, "ARAS_IT*");
                bool isTemplateFile = true;
                int arasDefinitionFileCount = filePaths.Length;
                TotalTemplateFile = arasDefinitionFileCount + Directory.GetFiles(folderPath, "ARAS_Rel*").Length;

                //progressBar1.Value=0;
                //int progess = 0;

                if (arasDefinitionFileCount < 1)
                {
                    isTemplateFile = false;
                    //MessageBox.Show("Root Folder does not contain Template File");
                    //return;
                }

                ManualResetEvent syncEvent = new ManualResetEvent(false);

                Thread ItmTh = new Thread(()=> 
                    {


                        //Iterate over Item Type files in Root Folder
                        for (int i = 0; i < arasDefinitionFileCount; i++)
                        {
                            //progess++;
                            //UpdateProgress(Convert.ToInt32(Convert.ToDouble((progess * 100) / progressBarValue)));
                            string fileName = filePaths[i];
                            //Find Name of Item Type From File Name
                            string ItemType = Path.GetFileNameWithoutExtension(fileName);
                            int start = ItemType.LastIndexOf('-');
                            int end = ItemType.Length;
                            start++;
                            end = end - start;
                            ItemType = ItemType.Substring(start, end);
                            //UpdateProgress(0);

                            if (ItemType.Equals("Document", StringComparison.InvariantCultureIgnoreCase))
                            {
                                Thread th = new Thread(() =>
                                    {
                                        processDocumentDataDefinitionFile(fileName, folderPath + "\\ARAS_IT-" + ItemType + "-files\\");

                                    });
                                th.Start();
                                //th.Join();
                            }
                            else
                            {
                                Thread th = new Thread(() =>
                                    {
                                       processDataDefinitionFile(fileName, tbRootFolderPath.Text, ItemType, folderPath + "\\ARAS_IT-" + ItemType + "-files\\");

                                    });
                                th.Start();
                                //Wait for Previous thread To complete its task
                                //th.Join();
                            }



                        }

                     });

                ItmTh.Start();
                /*******************************************************************************************************************/
                //Process Relationship files
                //ItmTh.Join();
                Thread RelTh = new Thread(()=> 
                    {

                        syncEvent.WaitOne();
                        filePaths = null;
                        filePaths = Directory.GetFiles(folderPath, "ARAS_Rel*");

                        arasDefinitionFileCount = filePaths.Length;

                        if (arasDefinitionFileCount < 1 && isTemplateFile == false)
                        {
                            MessageBox.Show("Root Folder does not contain Template File");
                            return;
                        }

                        //Iterate over Relationships files in Root Folder
                        for (int i = 0; i < arasDefinitionFileCount; i++)
                        {
                            string fileName = filePaths[i];

                            //Find Name of Item Type From File Name
                            string ItemType = Path.GetFileNameWithoutExtension(fileName);
                            int start = ItemType.LastIndexOf('-');
                            int end = ItemType.Length;
                            start++;
                            end = end - start;
                            ItemType = ItemType.Substring(start, end);

                            //Process File
                            Thread th = new Thread(() =>
                            {
                                Cursor.Current = Cursors.WaitCursor;

                                processDataDefinitionFile(fileName, tbRootFolderPath.Text, ItemType, folderPath + "\\ARAS_IT-" + ItemType + "-files\\");

                            });
                            th.Start();
                            //Wait for Previous thread To complete its task
                            // th.Join();

                        }

                    });

                        RelTh.Start();`
4

1 に答える 1

2

Tasks代わりに使用できますThreads-多くのスレッドを作成することは単なるオーバーヘッドです-コンピューターにはおそらくそれほど多くのCPUコアがありません。ハードウェアごとに適切な量のスレッドを実行していることTasks確認してください。Task Parallel Library

//... your code ...
Task ItmTask = new Task.Factory.StartNew(()=> 
    {
        Task[] subTasks = new Task[arasDefinitionFileCount];

        for (int i = 0; i < arasDefinitionFileCount; i++)
        {
            //... your code...

            if (ItemType.Equals("Document", StringComparison.InvariantCultureIgnoreCase))
            {
                subTasks[i] = new Task.Factory.StartNew(() =>
                    {
                        processDocumentDataDefinitionFile(fileName, folderPath + "\\ARAS_IT-" + ItemType + "-files\\");

                    });
            }
            else
            {
                subTasks[i] = new Task.Factory.StartNew(() =>
                    {
                       processDataDefinitionFile(fileName, tbRootFolderPath.Text, ItemType, folderPath + "\\ARAS_IT-" + ItemType + "-files\\");

                    });
            }
        }

         // Continue when all sub tasks are done
        Task.Factory.ContinueWhenAll(subTasks, _ => 
         {
            // Cursor.Current = Cursors.WaitCursor;

            // .... your code ....

            Task[] subTasks2 = new Task[arasDefinitionFileCount];

            for (int i = 0; i < arasDefinitionFileCount; i++)
            {
                subTasks2[i] = new Task.Factory.StartNew(() =>
                {
                    processDataDefinitionFile(fileName, tbRootFolderPath.Text, ItemType, folderPath + "\\ARAS_IT-" + ItemType + "-files\\");

                });

            }

            Task.Factory.ContinueWhenAll(subTasks2, __ => 
              {
                 // reset cursor to normal etc.
              });

         });
     });
于 2013-07-24T16:52:12.923 に答える