2016-02-25 5 views
0
public partial class Balloon : Form 
    { 
     public Balloon() 
     { 
      InitializeComponent(); 
      TopMost = true; 
      Rectangle r = Screen.PrimaryScreen.WorkingArea; 
      this.StartPosition = FormStartPosition.Manual; 
      this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width - 1, Screen.PrimaryScreen.WorkingArea.Height - this.Height - 8); 


      InstallStart2(); 
     } 

     private async void InstallStart2() 
     { 

      if (Dot35 == "Yes") 
      { 
       this.Titel.Text = "The Knowhow Installer is installing:"; 
       this.Action.Text = "Microsoft .Net Framework 2 & 3"; 
       if (File.Exists(root + Installfolder + "dotnetfx35.exe")) 
       { 
        Process process = Process.Start(root + Installfolder + "dotnetfx35.exe", "/q /norestart"); 

        while (!process.HasExited) ; 

        bool installFinished1 = false; 
        int k = -1; 
        string[] dots = new string[] { "Microsoft .Net Framework 2 & 3.", "Microsoft .Net Framework 2 & 3..", "Microsoft .Net Framework 2 & 3..." }; 

        while (!installFinished1) 
        { 
         Action.Text = dots[++k % 3]; 
         await Task.Delay(TimeSpan.FromSeconds(1.0)); 
        } 

        process.WaitForExit(); 
       } 
       else 
       { 
        this.TopMost = false; 
        int num = (int)MessageBox.Show("dotnetfx35.exe not found", "Error"); 
       } 
      } 
      await Task.Delay(TimeSpan.FromSeconds(2.0)); 







      if (Dot45 == "Yes") 
      { 
       this.Titel.Text = "The Knowhow Installer is installing:"; 
       this.Action.Text = "Microsoft .Net Framework 4.5"; 
       if (File.Exists(root + Installfolder + "dotnetFx45.exe")) 
       { 
        Process process = Process.Start(root + Installfolder + "dotnetFX45.exe", "/q"); 

        bool installFinished = false; 
        int k = -1; 
        string[] dots = new string[] { "Microsoft .Net Framework 4.5.", "Microsoft .Net Framework 4.5..", "Microsoft .Net Framework 4.5..." }; 

        while (!installFinished) 
        { 
         Action.Text = dots[++k % 3]; 
         await Task.Delay(TimeSpan.FromSeconds(1.0)); 
        } 





        while (!process.HasExited) ; 

       } 
       else 
       { 
        this.TopMost = false; 
        int num = (int)MessageBox.Show("dotnetFx45.exe not found", "Error"); 
       } 
      } 

      await Task.Delay(TimeSpan.FromSeconds(2.0)); 


      this.Action.Text = "Done"; 

      new SoundPlayer(root + otherfolder + "Done.wav").Play(); 
      await Task.Delay(TimeSpan.FromSeconds(5.0)); 

      Environment.CurrentDirectory = dir; 
      this.Close(); 
      new InstallDone().Show(); 




     } 

    } 

Это часть кода, и она работает для первой установки, но я не могу найти, куда положить bool installFinished1 = true;, чтобы перейти к следующему. Теперь он просто остается в Microsoft .Net Framework 4.5 ... (это переход от 1 до 3 точек в цикле)Ярлык Изменение в петле

+1

Что происходит, когда вы используете код, который вы размещены здесь? –

+3

Укажите тип вашего приложения (консоль, winforms, mvc и т. Д.) – Paul

+1

Установка dotnet из приложения dotnet? Если вы используете установщик clickonce, вы можете добавить это как необходимое условие. –

ответ

1

Если он должен быть await то это самый простой способ:

bool installFinished = false; 
int k = -1; 
string[] dots = new string[] { "Installing.", "Installing..", "Installing..." }; 

while (!installFinished) 
{ 
    Action.Text = dots[++k % 3]; 
    await Task.Delay(TimeSpan.FromSeconds(1.0)); 
} 
Action.Text = "Finished"; 

После завершения установки, настройки:

installFinished = true; 

Выше цикл остановится, а Action.Text - Finished.

Другой способ, вы можете использовать таймер.

Edit:

Base на вашем обновленном коде:

using System.Threading; 

bool installFinished = false; 

void Install_net45() 
{ 
    Process process = Process.Start(root + Installfolder + "dotnetFX45.exe", "/q"); 

    while (!process.WaitForExit(1000)) 
    { 
    } 
    installFinished = true; 
    // Clean up 
} 

private async void InstallStart2() 
{ 
    if (Dot45 == "Yes") 
    { 
     this.Titel.Text = "The Knowhow Installer is installing:"; 
     this.Action.Text = "Microsoft .Net Framework 4.5"; 
     if (File.Exists(root + Installfolder + "dotnetFx45.exe")) 
     { 

      installFinished = false; 

      Thread t = new Thread(Install_net45); 
      t.Start(); 

      int k = -1; 
      string[] dots = new string[] { "Installing.", "Installing..", "Installing..." }; 

      while (!installFinished) 
      { 
       Action.Text = dots[++k % 3]; 
       await Task.Delay(TimeSpan.FromSeconds(1.0)); 
      } 
      Action.Text = "Finished"; 
      MessageBox.Show("Test"); 
     } 
     else 
     { 
      this.TopMost = false; 
      int num = (int)MessageBox.Show("dotnetFx45.exe not found", "Error"); 
     } 
    } 
} 
+0

Он работает ... почти, но я не могу остановить его ... – Tobbe

+0

@Tobbe вам нужно объявить 'installFinished' вне вашего метода. Когда вы закончите установку, вызовите 'installFinished = true;'. Если вы объявите его внутри своего метода, это не сработает. – Sakura

+0

Iam потерял сознание ... скоро я сделаю изображение gif и использую это =) – Tobbe

1

Вы можете сделать что-то вроде:

Action.Text = "Installing."; 
Process process = Process.Start(root + Installfolder + "dotnetFX45.exe", "/q"); 
while(!process.WaitForExit(1000)){ 
    Action.Text += "."; 
} 

Но, если вы делаете это в обработчике событий в приложении Windows Forms это не будет работать так, как вы ожидаете. Вы будете блокировать поток пользовательского интерфейса, и поэтому он никогда не получит возможность повторно рисовать и показывать обновленный текст. В этом случае, вы должны использовать BackgroundWorker, с этим в DoWork:

Process process = Process.Start(root + Installfolder + "dotnetFX45.exe", "/q"); 
while(!process.WaitForExit(1000)){ 
    worker.ReportProgress(0.5); 
} 

А затем обновить Text свойства путем добавления . сек в ProgressChanged.

1

Используйте RxNet, образец кода

var interval = Observable.Interval(TimeSpan.FromMilliseconds(1000)); 
interval.Subscribe(
    () => Action.Text += ".", 
    () => Action.Text = "Completed"); 
Смежные вопросы