2012-03-28 3 views
2

Я пытаюсь создать простую процедуру потоковой передачи (если это моя первая попытка потоковой передачи), и все, что я хочу сделать, это для каждой строки в строке [] просто пройти через void и выполнить простую сканирование папки. Тем не менее, я ПОЛУЧАТЬ Имя метода ожидалось, и я не уверен, почемуC# threading Метод Имя ожидаемой ошибки

string[] FileListing = {@"C:\","E:\"}; 
     foreach (string fl in FileListing) 
     { 
      ProjectDirectoryProcessing pjp = new ProjectDirectoryProcessing(); 
      //error here 
      Thread oThread = new Thread(new ThreadStart(pjp.ProjectProcessor(fl))); 
      oThread.Start(); 
     } 

public class ProjectDirectoryProcessing 
{ 
    public void ProjectProcessor(string rootDirectory) 
    { 
     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     HashSet<string> DirectoryHolding = new HashSet<string>(); 
     //do some work 
     //foreach loop 
    }; 
    } 
+0

Это потому, что вы передаете параметр в вашем 'ThreadStart', не спрашивайте меня, почему, но у меня было это раньше :) –

+0

хорошо, как я передаю параметр, хотя, или мне просто нужно сделать еще одну пустоту –

+0

Попробуйте мой ответ ниже –

ответ

1

Вам необходимо пройти в качестве делегата, вы можете сделать это с лямбда:

Thread oThread = 
     new Thread(() => pjp.ProjectProcessor(fl)); 

Но тогда вы бы захватив переменную петли, так что она

foreach (string fl in FileListing) 
    { 
     string copy = fl; 

     ProjectDirectoryProcessing pjp = new ProjectDirectoryProcessing(); 
     //error here 
     Thread oThread = 
      new Thread(() => pjp.ProjectProcessor(copy)); 
     oThread.Start(); 
    } 

Дополнительная

Весьма дорого сделать нить каждый раз, вероятно, вам лучше использовать:

Parallel.ForEach(FileListing, fl => 
     {    
     ProjectDirectoryProcessing pjp = new ProjectDirectoryProcessing();   
     pjp.ProjectProcessor(fl); 

     }); 
    // when here: all threads are done. 

Отметьте, что pjp теперь создан на темы.

+0

Я просто попробовал это, но почему я не вижу консоль.writeline, которая возникает из pjp.Propjectprocessor? –

+0

Я не могу ответить на этот вопрос без кода ProjectProcessor. Можете ли вы установить в нем точку останова? –

+0

Он входит в эту точку останова, однако я думаю, что мой program.class заканчивается до того, как pjp заканчивается, поэтому приложение закрывается без завершения ... –

2

Вы должны пройти делегат конструктору потока. Самый простой способ сделать это здесь, чтобы использовать лямбда-выражение:

string copy = fl; 
Thread oThread = new Thread(() => pjp.ProjectProcessor(copy)); 

Обратите внимание, что вам нужно сделать копию переменной цикла из-за способа, что переменные цикла захватываются. (См Eric Lippert's blog post для более подробной информации.)

Альтернативно, как вы создаете новый ProjectDirectoryProcessing экземпляр на каждой итерации, можно передать строку в конструктор вместо:

foreach (string fl in FileListing) 
{ 
    // Note change in name to be clearer (IMO) 
    ProjectDirectoryProcessor pjp = new ProjectDirectoryProcessor(fl); 
    Thread oThread = new Thread(pjp.Execute); 
    oThread.Start(); 
} 

...

public class ProjectDirectoryProcessor 
{ 
    private readonly string rootDirectory; 

    public ProjectDirectoryProcessor(string rootDirectory) 
    { 
     this.rootDirectory = rootDirectory; 
    } 

    public void Execute() 
    { 
     Stopwatch stopwatch = Stopwatch.StartNew(); 
     HashSet<string> DirectoryHolding = new HashSet<string>(); 
     // do some work 
     //foreach loop 
    } 
} 
0
Thread oThread = new Thread(new ThreadStart(pjp.ProjectProcessor(fl))); 

Вы, по существу, проходя void в качестве аргумента конструктора ThreadStart.

+0

Что изменилось в вашем коде? –

0

Должна ли быть нитью? Задача лучше подходит для этого. Перестановка из:

Thread oThread = new Thread(new ThreadStart(pjp.ProjectProcessor(fl))); 
oThread.Start(); 

с:

Task.Factory.StartNew(pjp.ProjectProcessor(fl)); 
+0

Да, это похоже на то, что полная строка [] будет содержать около ста этих –

+0

. Я думаю, что это тоже 'StartNew (void)'. –

Смежные вопросы