110,534
社区成员
发帖
与我相关
我的任务
分享
public async static Task<CompilerData> RunCmd(CompilerData cdata)
{
await Task.Run(() =>
{
var cancellationTokenSource = new CancellationTokenSource();
var th = new Thread(() =>
{
Run(cdata);
});
cancellationTokenSource.Token.Register(() =>
{
th.Abort();
cdata.TimeOut = true;
Process[] process = Process.GetProcesses();
var proc = process.FirstOrDefault(i => i.ProcessName == cdata.ExeName);
if (proc != null)
{
if (!proc.HasExited)
{
//立即停止相关进程。意即,进程没回应,强制关闭
proc.Kill();
}
if (proc != null)
{
proc.Close();
proc.Dispose();
proc = null;
}
}
});
cancellationTokenSource.CancelAfter(60000);
th.Start();
th.Join();
});
return cdata;
}
/// <summary>
/// 执行命令
/// </summary>
/// <param name="cdata"></param>
private static void Run(CompilerData cdata)
{
List<ProcessModel> proclist = HelperCache.GetCache("Process") as List<ProcessModel>;
if (proclist == null)
{
proclist = new List<ProcessModel>();
}
cdata.IsSuccess = false;
cdata.Error = "命令为空";
if (!string.IsNullOrWhiteSpace(cdata.ExecuteThis))
{
Process proc = new Process();//创建进程对象
proc.StartInfo.FileName = CMDPath;//设定需要执行的命令
proc.StartInfo.Arguments = "/C " + cdata.Executor + " " + cdata.ExecuteThis;//“/C”表示执行完命令后马上退出
proc.StartInfo.UseShellExecute = false;//不使用系统外壳程序启动
proc.StartInfo.RedirectStandardInput = false;//不重定向输入
proc.StartInfo.RedirectStandardOutput = true; //重定向输出
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.CreateNoWindow = true;//不创建窗口
try
{
if (proc.Start())
{
Stopwatch watch = new Stopwatch();
watch.Start();
ProcessModel model = new ProcessModel()
{
Id = proc.Id,
ProcessName = proc.ProcessName,
StartTime = proc.StartTime,
MaxCompileTime = cdata.MaxCompileTime
};
proclist.Add(model);
HelperCache.SetCache("Process", proclist);
HelperCache.RemoveAllCache(cdata.ExeName);
HelperCache.SetCache(cdata.ExeName, cdata.ExeName);
cdata.Success = proc.StandardOutput.ReadToEnd();//读取进程的输出
cdata.Error = proc.StandardError.ReadToEnd();
watch.Stop();
proc.WaitForExit();
cdata.CompileTimeMs = watch.Elapsed.TotalMilliseconds;
OnlineData.Helper.HelperLog.Info(string.Format("成功{0},失败{1}", cdata.Success, cdata.Error));
cdata.IsSuccess = string.IsNullOrWhiteSpace(cdata.Error) ? true : false;
}
}
catch (Exception ex)
{
cdata.Error = proc.StandardError.ReadToEnd();
OnlineData.Helper.HelperLog.Info(string.Format("成功{0},失败{1}", cdata.Success, cdata.Error), ex);
cdata.IsSuccess = false;
}
finally
{
if (!proc.HasExited)
{
//立即停止相关进程。意即,进程没回应,强制关闭
proc.Kill();
}
if (proc != null)
{
proc.Close();
proc.Dispose();
proc = null;
}
}
}
}