当线程具有启动参数时启动和连接线程

本文关键字:线程 启动 连接 连接线 参数 | 更新日期: 2023-09-27 18:03:04

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

I try a

testthread().Join();

就在
new Thread(()…

但是它得到一个错误,因为它希望我传递相同的参数,我传递给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...
}

当线程具有启动参数时启动和连接线程

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

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

也看起来像你在UI线程上执行foreach循环- 这会阻塞UI线程,对于长时间运行的操作来说通常不是一件好事。我建议您将循环代码移动到您在另一个线程上执行的单独方法中,也摆脱了每个文件处理的单独线程。

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

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

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