Запуск и присоединение к потоку, когда поток имеет параметры запуска - PullRequest
1 голос
/ 23 июля 2011

В моем коде ниже я беру файлы, которые перетаскиваем на кнопку в моей форме, и обрабатываю их потоком. Я хочу, чтобы каждый поток мог завершить свою работу, прежде чем цикл foreach будет продолжен и обрабатывает следующий файл.

Я попробовал

testthread (). Join ();

сразу после

нового потока (() ...

, но он получает ошибку, потому что хочет, чтобы я передавал те же параметры, которые я передаю в testthread, когда Я изначально запускаю тему.

Может кто-нибудь показать мне команду и синтаксис, который я использовал бы для объединения потоков?

private void btnClick_DragDrop(object sender, DragEventArgs e)
{
    string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);

    string ButtonName = "TestButton"

    string[] files = new string[10];

    files = (string[])e.Data.GetData(DataFormats.FileDrop);


    foreach (string file in files)
    {
        FileInfo fileInfo = new FileInfo(file);

        Console.WriteLine("++  Filename: " + fileInfo.Name + "   Date of file: " + fileInfo.CreationTime + "   Type of file: " + fileInfo.Extension + "   Size of file: " + fileInfo.Length.ToString());

        string CleanFileName = System.Web.HttpUtility.UrlEncode(fileInfo.Name.ToString());

        //Start  thread
        try
        {
            Console.WriteLine("++ Calling testthread with these params: false, " + ButtonName + "," + CleanFileName + "," + file);

            new Thread(() => testthread(false, ButtonName, CleanFileName, file)).Start();

            testthread().Join(); //THIS DOES NOT WORK BECAUSE IT WANTS THE PARAMETERS THAT THE THREAD IS EXPECTING.  WHAT CAN I PUT HERE SO IT WAITS FOR THE THREAD TO FINISH BEFORE CONTINUING THE FOREACH LOOP ?
         }
         catch (Exception ipwse)
         {
         Console.WriteLine(ipwse.Message + " " + ipwse.StackTrace);
         }
     }
}
public void testthread(bool CalledfromPendingUploads, string ButtonName, string CleanFileName, string FilePath)
{
    //My Code to do the file processing that I want done.  I do not want multiple threads to run at once here.  I need the thread to complete, then the foreach loop to continue to the next file and then start another thread and wait, etc...
}

Ответы [ 3 ]

2 голосов
/ 23 июля 2011

Если вы делаете что-то последовательно, зачем вам вообще нужны отдельные потоки?

Thread t = new Thread(() => testthread(false, ButtonName, CleanFileName, file));
t.Start();
t.Join();

Редактировать:

Также похоже, что вы выполняете своицикл foreach в потоке пользовательского интерфейса - это заблокирует поток пользовательского интерфейса и, как правило, не подходит для длительной работы.Я бы посоветовал вам переместить цикл в отдельный метод, который вы выполняете в другом потоке, а также избавиться от отдельного потока для каждой обработки файла.

2 голосов
/ 23 июля 2011
var myThread = new Thread(...
myThread.Start();
myThread.Join();

И что вы делаете, это вызываете процедуру потока, ожидая, что она вернет что-то, что имеет метод, называемый «Join». Join - это метод объекта Thread. Создайте объект потока и работайте с ним.

0 голосов
/ 23 июля 2011

Темы не ваш ответ здесь. Если вам нужно дождаться завершения потока, прежде чем вы сможете запустить следующий, вы столкнетесь с тем же узким местом, если вы вообще не использовали потоки. Однако, если вы используете .NET 4.0, библиотека параллельных задач определенно вам здесь поможет. Используя параллельные задачи, вы можете запустить цикл foreach параллельно и ускорить выполнение программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...