2012-03-28 3 views
2

私は単純なスレッド手順を作成しようとしています(これはスレッドでの最初の試みです)、私がしたいのは、文字列[]内の各文字列に対してです。単純なフォルダークロールを実行します。しかし、私は、メソッド名が期待されるrecievingだと私はあなたがスレッドコンストラクタにデリゲートを渡すために持っている理由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

これを持っていました私はパラメータを渡すか、それとももう1つ無効にする必要があります –

+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

しかし、私はこれを試してみましたが、なぜpjp.Propjectprocessorのconsole.writelineが表示されないのですか? –

+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))); 

あなたは、本質的にThreadStartコンストラクタの引数としてvoidを渡しています。

+0

あなたのコードで何が変わったのですか? –

0

スレッドにする必要がありますか?タスクがこれに適しています。スワップアウト:

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

をして:

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

ええ、完全な文字列[]はこれらの約百を含んでいるので、それはありません –

+0

私はこれも 'StartNew(void)'と思います。 –

関連する問題