【问题标题】:Use a Stop button in C# to stop the Build Process在 C# 中使用停止按钮停止构建过程
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我上面有我的代码,请让我知道我做错了什么??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2017-01-26
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多