110,536
社区成员
发帖
与我相关
我的任务
分享
#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);
}
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;
}
}
}
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
}
//同步锁对象
private Object lockObject = new Object();
lock(){
//方法代码
}
这样的锁定模式,不是执行到花括号就释放锁定吗?