【问题标题】:calling same method with passed values using threads使用线程调用具有传递值的相同方法
【发布时间】:2011-06-06 12:23:25
【问题描述】:

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

列表框填充待处理的待处理作业,系统计时器用于每 30 秒检查一次列表框的内容并处理列表中的任何作业..

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

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

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

这是我的代码示例:

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

    }

【问题讨论】:

  • 在您的StartJob 方法中,您完全 忽略了job 参数的值。不清楚你想用它做什么......
  • 我不会使用列表框来跟踪工作。阅读一些关于工作窃取作业系统的内容,并使用同步锁围绕队列/堆栈实现它。也许所有的工作都开始同一个过程。

标签: c# multithreading


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2010-10-21
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      相关资源
      最近更新 更多