2015-05-21 52 views
-2

我有2个按钮名称为“Build Start”和“Build Stop”。我想要的是当我点击停止按钮时,它将停止执行所有项目的构建。我已经尝试了Backgroundworker类,但是当我使用RunworkerAsync()函数时,它只会构建一个项目文件并在此后停止执行。这可能是背后的原因,以及如何解决这个问题。在C#中使用停止按钮来停止构建过程

我有一个字符串数组,用.sln扩展名显示所有项目的列表,我运行这个数组来构建一个一个一个地位于.sln文件路径中的项目。如何构建所有.sln文件,以及为什么当我使用RunWorkerAsync()时,所有文件都不会生成。

有什么办法可以使用线程来实现这个。

现在发生的事情是,当我单击Build Start按钮构建继续时,但这不允许我单击Stop按钮来停止构建过程。

我兹附上我的代码: -

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(); 

     } 

这里是我执行的代码,但是当我点击停止按钮我不能停止这是在调用该函数运行的进程。我在哪里做错了?请让我知道。

谢谢。

+0

你做错了,我们看不到你做错了。将* false *传递给[Build method](https://msdn.microsoft.com/en-us/library/envdte.solutionbuild.build.aspx)。 –

+0

@hansPassant,我不想为此使用DTE环境和solutionbuild接口。 – tdesai

回答

1

现在,我不确定,但我假设您正在构建自己的C#.Net应用程序来构建其他.Net解决方案(使用.sln文件扩展名)。对? 我会相信,你不能点击停止按钮的原因是你正在主线程上构建,所以GUI是bussy。 您声明您已尝试在BackgroundWorker中使用,但它不起作用。使用BackgroundWorker构建解决方案可以正确解决停止按钮问题。 如果您需要修复BackgroundWorker的帮助,则可能需要提供不起作用的部分源代码。

+0

我有我的代码上面请让我知道我在做什么错了? – tdesai