线程具有启动参数时启动并加入线程

时间:2011-07-22 20:16:31

标签: c# multithreading thread-safety threadpool

在我的下面的代码中,我将正在拖放到表单上的按钮上的文件,并使用线程处理它们。我希望能够让每个线程在foreach循环继续之前完成它的操作并处理下一个文件。

我尝试了一个测试线程()。加入();

正好在新线程(()...

之后但由于它要求我传递相同的参数而得到错误我最初启动线程时传递给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 个答案:

答案 0 :(得分:2)

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

你所做的是调用线程程序,期望它返回一个名为“Join”的方法。 Join是Thread对象的一种方法。构造线程对象并使用它。

答案 1 :(得分:2)

如果你是连续做事,为什么你需要单独的线程呢?

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

修改

此外,您似乎正在UI线程上执行foreach循环 - 这将阻止UI线程,对于长时间运行的操作通常不是一件好事。我建议你将循环代码移动到另一个在另一个线程上执行的单独方法,也为每个文件处理删除单独的线程。

答案 2 :(得分:0)

线程不是你的答案。如果您需要等待一个线程完成才能启动下一个线程,那么如果您根本不使用线程,那么您将遇到同样的瓶颈。但是,如果您使用.NET 4.0,那么并行任务库肯定会帮助您。使用并行任务,您可以让foreach循环并行运行并加快程序的运行。