【发布时间】:2015-05-21 07:12:31
【问题描述】:
我有 2 个按钮名称为“构建开始”和“构建停止”。我想要的是当我单击停止按钮时,它将停止执行所有项目的构建。我已经尝试过 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();
}
这是我正在执行的代码,但是当我单击停止按钮时,我无法停止正在调用的函数中运行的进程。我在哪里做错了?请务必告诉我。
谢谢。
【问题讨论】:
-
你做错了,我们看不到你做错了。将 false 传递给 Build method。
-
@hansPassant,我不想为此使用 DTE 环境和解决方案构建接口。
标签: c# multithreading backgroundworker