【发布时间】: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