2011-07-22 6 views
1

以下のコードでは、フォーム上のボタンにドラッグアンドドロップされたファイルを取り出し、スレッドで処理しています。 foreachループが継続され、次のファイルを処理する前に、各スレッドがその操作を完了できるようにしたい。スレッドが開始パラメータを持つときにスレッドを開始して結合する

私は試しました

testthread()。Join();



新しいThread(()...

が、それは私が最初にスレッドを起動したとき、私はtestthreadに渡すのと同じパラメータを渡すために私を望んでいるので、それがエラーを取得します。

後の缶誰かしてくださいそれは方法Cを持っている何かを返す期待し、私が?

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... 
} 
+2

スレッドを開始してから待機するのは無意味です。 testthread()を直接呼び出してください。 –

答えて

2

あなたがシリアルで作業している場合、なぜ別のスレッドが必要なのですか?

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

編集:また、それはあなたがUIスレッド上で、あなたのforeachループを実行しているように見えます

- これはUIスレッドをブロックしますと、一般的に長いために行うには良いことではありません実行中の操作。私はあなたが別のスレッドで実行する別のメソッドにループコードを移動することをお勧めします、また、各ファイル処理のための別のスレッドを取り除く。

+0

はい、あなたは正しいです。私は思っていませんでした。 UIスレッドがブロックされていたので、まずスレッドを実行していました。 .Join()を使うとその目的が破られ、私がどこで始めたのか、私のところに戻ってきます。あなたはループコードを別の方法に移したと言いました。ループするコードを自分自身のスレッドに移動して、ループ内で処理しているすべてのファイルを処理するという意味ですか? – fraXis

+0

@fraXis:そうです。 – BrokenGlass

2
var myThread = new Thread(... 
myThread.Start(); 
myThread.Join(); 

そして何をやっては、スレッドプロシージャを呼び出しているに参加するスレッドを達成するために使用するコマンドと構文を表示alled "Join"。 JoinはThreadオブジェクトのメソッドです。スレッドオブジェクトを構築し、それを処理します。

0

スレッドはあなたの答えではありません。次のスレッドを開始する前にスレッドが完了するのを待つ必要がある場合、スレッドをまったく使用しなかった場合は同じボトルネックに陥るでしょう。ただし、.NET 4.0を使用している場合は、Parallel Task Libraryがここで間違いなく役立ちます。並列タスクを使用すると、foreachループを並行して実行してプログラムを高速化できます。

関連する問題