使用C#中的停止按钮停止构建过程
我有两个按钮名为“构建开始”和“构建停止”。我想要的是,当我点击停止按钮时,它将停止所有项目的建设执行。我尝试过Backgroundworker类,但当我使用RunworkerAsync()函数时,它将只生成一个项目文件,并在此后停止执行。这背后的原因是什么?如何解决这个问题 我有一个字符串数组,它显示扩展名为.sln的所有项目的列表,我通过这个数组逐个构建.sln文件路径中的项目。如何生成所有.sln文件,以及为什么在使用RunWorkerAsync()时所有文件都没有生成 是否有任何方法可以使用线程实现此功能 现在发生的事情是,当我单击Build Start(构建开始)按钮时,构建将继续,但这不允许我单击Stop(停止)按钮来停止构建过程 我随函附上我的代码:-使用C#中的停止按钮停止构建过程,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我有两个按钮名为“构建开始”和“构建停止”。我想要的是,当我点击停止按钮时,它将停止所有项目的建设执行。我尝试过Backgroundworker类,但当我使用RunworkerAsync()函数时,它将只生成一个项目文件,并在此后停止执行。这背后的原因是什么?如何解决这个问题 我有一个字符串数组,它显示扩展名为.sln的所有项目的列表,我通过这个数组逐个构建.sln文件路径中的项目。如何生成所有.sln文件,以及为什么在使用RunWorkerAsync()时所有文件都没有生成 是否有任何方法可以
private BackgroundWorker backgroundWorker = new BackgroundWorker();
public Form1()
{
InitializeComponent();
cmb_drive.SelectedItem = "Z";
// backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
// backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// BackgroundWorker worker = sender as BackgroundWorker;
if (checkbox1.Checked)
{
function1();
}
}
private void bn_Start_Click(object sender, EventArgs e)
{
backgroundWorker.RunWorkerAsync();
}
private void bn_Stop_Click(object sender, EventArgs e)
{
backgroundWorker.CancelAsync();
}
void function1()
{
FOLDER1 = DRIVE + @":\Foldername1";
LOGFILE1 = FOLDER1 + @"\Foldername2";
Process msbuild;
msbuild = new Process();
DEVENV = Environment.GetEnvironmentVariable("VS100COMNTOOLS") + @"..\IDE\devenv.exe";
var list = System.IO.Directory.GetFiles(LOGFILE1);
foreach (var item in list)
{
System.IO.File.Delete(item);
}
// Creation of array of string to Build Projects before Building Up.
array[0] = @"\make\versionupdate\versionupdate_vs2010.sln /build Release";
for (int k = 0; k < array.Length; k++)
{
this.lbl_CurrentProject.Text = "Current Project: " + @" " + array[k];
msbuild.StartInfo.UseShellExecute = false;
msbuild.StartInfo.CreateNoWindow = true;
msbuild.StartInfo.Arguments = FOLDER1 + array[k] + @" /out " + LOGFILE1;
msbuild.StartInfo.FileName = DEVENV;
msbuild.Start();
msbuild.WaitForExit();
}
private BackgroundWorker BackgroundWorker=new BackgroundWorker();
公共表格1()
{
初始化组件();
cmb_drive.SelectedItem=“Z”;
//backgroundWorker.WorkerSupportsScanCellation=true;
backgroundWorker.WorkerReportsProgress=true;
backgroundWorker.WorkerSupportsScanCellation=true;
backgroundWorker.DoWork+=新的DoworkerVenthandler(backgroundWorker_DoWork);
//backgroundWorker.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker\u ProgressChanged);
}
私有void backgroundWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
//BackgroundWorker worker=发件人作为BackgroundWorker;
如果(复选框1.选中)
{
功能1();
}
}
私有void bn\u开始\u单击(对象发送方,事件参数e)
{
backgroundWorker.RunWorkerAsync();
}
私有无效bn\u停止\u单击(对象发送方,事件参数e)
{
backgroundWorker.CancelAsync();
}
无效函数1()
{
FOLDER1=DRIVE+@:“\Foldername1”;
LOGFILE1=FOLDER1+@“\Foldername2”;
进程msbuild;
msbuild=新进程();
DEVENV=Environment.GetEnvironmentVariable(“VS100COMNTOOLS”)+@.\IDE\DEVENV.exe;
var list=System.IO.Directory.GetFiles(LOGFILE1);
foreach(列表中的变量项)
{
System.IO.File.Delete(项目);
}
//创建字符串数组以在生成项目之前生成项目。
数组[0]=@“\make\versionupdate\versionupdate\u vs2010.sln/build Release”;
for(int k=0;k
这是我正在执行的代码,但我无法停止在单击停止按钮时调用的函数中运行的进程。我做错了什么?请务必告诉我
谢谢。现在,我不确定,但我假设您正在构建自己的C#.Net应用程序,以构建其他.Net解决方案(具有.sln文件扩展名)。对吗? 我相信,你不能点击你的停止按钮的原因,是你在主线程上构建,所以GUI是繁忙的。 您声明您已尝试在BackgroundWorker上使用,但无效。使用BackgroundWorker构建解决方案将很好地解决停止按钮问题。
如果您需要帮助修复BackgroundWorker,您可能必须提供不起作用的部分源代码。您做错了,我们看不出您做错了。将false传递给@hansPassant,我不想为此使用DTE环境和solutionbuild接口。我有上面的代码,请务必让我知道我的位置错了吗??