使用线程使用传递的值调用相同的方法

时间:2011-06-06 12:23:26

标签: c# multithreading

我试图调用一个方法传递不同的值来压缩文件夹,我使用线程来处理同一方法的多次运行..

列出一个列表框,其中包含要处理的待处理作业,system.timer用于每30秒检查一次列表框的内容并处理列表中的所有作业。

该过程涉及从列表中获取记录..其中包含zip文件名,将在当前目录中提取zip文件。

我的问题是..当我有多个线程尝试解压缩文件时,我最终只能解压缩1个文件夹,例如..第一个调用应该解压缩folder1,第二个调用应该解压缩folder2,但是当system.timer处理列表的内容时...我总是得到1个解压缩的文件夹。

每次程序启动时,列表将填充2个条目,如果我只在列表中放置folder1条目,则folder1得到解压缩,如果我在列表中放置folder2条目,则folder2得到解压缩,所以我知道有条目没有问题。

下面是我的代码示例:

private void JobStarterTimerEvent(object source, ElapsedEventArgs e)
{
        foreach (JobModel jm in ListofWaitingBackupJobs)
        {
            if (jm.Status.DataValue == "Waiting")
            {
                //check if the server has a pending job running ... 
                // add this check later
                ThreadPool.QueueUserWorkItem(StartJob, jm);
            }
        }
 }


    private  void StartJob(object job)
    {

        string outputdirectory;
        outputdirectory = System.IO.Directory.GetCurrentDirectory();
        ProcessStartInfo p2 = new ProcessStartInfo();
        p2.FileName = "7za.exe ";

        p2.Arguments = "x " + backupname + " -o" + @outputdirectory + " -y";


        p2.WindowStyle = ProcessWindowStyle.Hidden;
        Process x2 = Process.Start(p2);
        x2.WaitForExit();

    }

2 个答案:

答案 0 :(得分:1)

您似乎使用相同的输出目录。正如Jon所暗示的那样,您可能希望使用该参数来确定要解压缩到的相关唯一文件夹。

答案 1 :(得分:0)

我的错误..对象作业被转换为Jobmodel ... 我解决了这个问题..我在类的顶部声明了backupname.so每次调用StartJob方法..都读取最新的backupname变量..我应该在StartJob方法中声明backupname作为局部变量。