多线程问题:两个线程做类似的工作,只有一个线程工作?

on_my_way20xx 2013-12-09 02:41:31
小弟写一个小程序主要逻辑:
主界面通过一个按钮单击事件触发,构建两个线程做类似的事情.但是测试中发现,只有线程1在工作,线程2貌似完全沉睡了... 代码如下:

线程1执行的方法


#region //线程方法
private void SyncData(Object obj)
{
lock (lockObject)
{
while (!needStop)
{

try
{
PkgArg pkgArg = (PkgArg)obj;
SyncHelper syncHelper = new SyncHelper();
syncHelper.exePackage(pkgArg);
Thread.Sleep(5000);
MessageBox.Show(Thread.CurrentThread.Name +"正在工作!");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}

}
}

}
#endregion





调用线程的入口:


private void button1_Click(object sender, EventArgs e)
{
//启动线程一
//构建一个传递给线程的参数
PkgArg argOne = new PkgArg();
argOne.DstxName = dstxNameOne;
argOne.PkgPwd = pkgPwd;
argOne.DstxCfgPath = dstxCfgPathOne;
argOne.TimePeriod = timePeriodOne;
workerOne = new Thread(new ParameterizedThreadStart(SyncData));
workerOne.Name = "toMSDE";

//启动线程二
//构建一个传递给线程的参数
PkgArg argTwo = new PkgArg();
argTwo.DstxName = dstxNameTwo;
argTwo.PkgPwd = pkgPwd;
argTwo.DstxCfgPath = dstxCfgPathTwo;
argTwo.TimePeriod = timePeriodTwo;
workerTwo = new Thread(new ParameterizedThreadStart(SyncData));
workerTwo.Name = "toRemote";

workerOne.Start(argOne);
workerTwo.Start(argTwo);

}



SyncHelper类
using System;
using System.Collections.Generic;
using System.Text;
//using Microsoft.SqlServer.Dts.Runtime;
using System.Diagnostics;
using System.Windows.Forms;
using System.Threading;



namespace dbWatcher
{
public class SyncHelper
{

//调用dtexec.exe执行

public bool exePackage(PkgArg pkgArg)
{
//调用dos命令
String str = Application.StartupPath + @"\dtexec.exe /f " +pkgArg.DstxName
+ " /conf " + pkgArg.DstxCfgPath +" /de " + pkgArg.PkgPwd;

try
{
//执行并收集结果 如果包含DTSER_SUCCESS 则认为执行成功
String outMsg = Execute(str, 0);
if (outMsg != null && outMsg.Contains("DTSER_SUCCESS"))
{
return true;
}
else
{

MessageBox.Show(outMsg.Substring(outMsg.Length-201,200));
}


}
catch
{
throw;
}

return false;
}


//用于执行DOS命令的方法
private string Execute(string dosCommand, int milliseconds)
{
string output = ""; //输出字符串
if (dosCommand != null && dosCommand != "")
{
Process process = new Process(); //创建进程对象
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "cmd.exe"; //设定需要执行的命令
startInfo.Arguments = "/C " + dosCommand; //设定参数,其中的“/C”表示执行完命令后马上退出
startInfo.UseShellExecute = false; //不使用系统外壳程序启动
startInfo.RedirectStandardInput = false; //不重定向输入
startInfo.RedirectStandardOutput = true; //重定向输出
startInfo.CreateNoWindow = true; //不创建窗口
process.StartInfo = startInfo;
try
{
if (process.Start()) //开始进程
{
output = process.StandardOutput.ReadToEnd();//读取进程的输出
}
}
catch
{
throw;
}
finally
{
if (process != null)
process.Close();
}
}
return output;
}

}
}


参数类PkgArg

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dbWatcher
{
#region 当做参数传递的类
public class PkgArg
{
//包路径
private String dstxName;
public System.String DstxName
{
get { return dstxName; }
set { dstxName = value; }
}
//包配置文件路径
private String dstxCfgPath;
public System.String DstxCfgPath
{
get { return dstxCfgPath; }
set { dstxCfgPath = value; }
}
//包密码
private String pkgPwd;
public System.String PkgPwd
{
get { return pkgPwd; }
set { pkgPwd = value; }
}

//同步周期
private int timePeriod;
public int TimePeriod
{
get { return timePeriod; }
set { timePeriod = value; }
}
}
#endregion
}


...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
on_my_way20xx 2013-12-09
  • 打赏
  • 举报
回复
谢谢各位大神指导. 不过我自己试验出解决方法了,我自己重新建立一个方法拷贝原方法的代码竟然就解决了!!!日啊
cheery_an 2013-12-09
  • 打赏
  • 举报
回复
锁是没错的,可是锁错地方了。应该把锁定义在你那个类SyncHelper里面,且锁在那个方法的开始和结束不行么?(方法也可以理解为一些代码语句吧,只要把那些语句锁住)http://msdn.microsoft.com/zh-cn/library/c5kehkcz%28v=vs.90%29.aspx
on_my_way20xx 2013-12-09
  • 打赏
  • 举报
回复
求解答???
on_my_way20xx 2013-12-09
  • 打赏
  • 举报
回复
引用 3 楼 bdmh 的回复:
lockObject应该是个全局的静态变量吧,你第一个线程工作时,就被lock了,第二个肯定是不工作的,它要等第一个解锁后才会工作,而你第一个就一直不解锁
lockObject 声明如下:

        //同步锁对象
        private Object lockObject = new Object();
        lock(){
            //方法代码
         }

这样的锁定模式,不是执行到花括号就释放锁定吗?
on_my_way20xx 2013-12-09
  • 打赏
  • 举报
回复
引用 2 楼 CSDNFucker 的回复:
lock (lockObject)这样就只可以一个进程进入了
我加lock是为了线程同步啊,防止两个线程同时执行一个方法的,我设计的初衷是某个线程完整的执行完这个方法以后就退出,让另外一个线程来执行这个方法.但是现在是两个线程无论哪个启动都会一直执行这个方法,另外一个线程没机会执行了..
bdmh 2013-12-09
  • 打赏
  • 举报
回复
lockObject应该是个全局的静态变量吧,你第一个线程工作时,就被lock了,第二个肯定是不工作的,它要等第一个解锁后才会工作,而你第一个就一直不解锁
CSDNFucker 2013-12-09
  • 打赏
  • 举报
回复
lock (lockObject)这样就只可以一个进程进入了
on_my_way20xx 2013-12-09
  • 打赏
  • 举报
回复
手工置顶!求大神.......

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧