使用C#中的“停止”按钮停止构建过程

时间:2015-05-21 07:12:31

标签: c# multithreading backgroundworker

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

我有一个字符串数组,它显示了扩展名为.sln的所有项目的列表,并且我通过这个数组逐个构建项目,这些项目位于.sln文件路径中。当我使用RunWorkerAsync()时,如何构建所有.sln文件以及为什么所有文件都没有构建。

有没有办法使用线程来实现它。

现在发生的事情是,当我单击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();

       }

这是我正在执行的代码但是我无法停止在单击停止按钮时调用的函数中运行的进程。我在哪里做错了?请告诉我。

感谢。

1 个答案:

答案 0 :(得分:1)

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