2015-08-19 3 views
0

У меня есть одно приложение, в котором после выполнения задачи1 я должен показать индикатор выполнения на экране. Сразу же после показа индикатора выполнения я должен начать выполнение задачи2. Когда task2 будет завершен, индикатор выполнения будет скрыт от экрана.Как синхронизировать задачи между двумя формами?

Задача1 и задача2 выполняются в отдельных формах.

Я не хочу использовать рабочий поток для этого. А также, на индикаторе выполнения, не должно быть никакого пользовательского ввода для его скрытия.

Я новичок в C#. Пожалуйста, помогите в достижении этого.

Пожалуйста, помогите. Заранее спасибо.

+1

Вы действительно * действительно * хотите использовать рабочий поток для этого, предпочтительно обрабатывается [BackgroundWorker] (https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker (v = vs.110) .aspx), поскольку он заботится о многих деталях и обеспечивает легкие события Winform/совместимость; включая возможность сообщать о прогрессе. – user2864740

+0

Почему вы думаете, что не хотите использовать рабочий поток? – BugFinder

+0

Привет, Если я использую поток рабочего стола фона (BackgroundWorker), тогда он будет связываться между двумя разными формами? – user5169166

ответ

0

Возможно, но странно. Вы должны добавить вызовы для обновления формы выполнения в task2.

public partial class ProgressForm : Form 
    { 
     public ProgressForm() 
     { 
      InitializeComponent(); 
      this.TopMost = true; 
     } 

     public void SetProgress(int progress) 
     { 
      this.progressBar1.Value = progress; 
      // Allow the form to be repainted 
      Application.DoEvents(); 
     } 
    } 


    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     ProgressForm progressForm = new ProgressForm(); 
     void Task2() 
     { 
      ShowProgress(0); 
      for (int i = 0; i < 10; i++) 
      { 
       System.Threading.Thread.Sleep(1000); 
       ShowProgress(i * 10); 
      } 
      HideProgress(); 
     } 


     void ShowProgress(int progress) 
     { 
      if (!progressForm.Visible) 
       progressForm.Show(); 
      progressForm.SetProgress(progress); 
     } 

     void HideProgress() 
     { 
      progressForm.Hide(); // or Close, it depends from app logic 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      Task2(); 
     } 
    } 
+0

В реальной жизни я бы использовал вместо этого решение с потоками. – AlexS

0

Если «две формы» вы упомянули выше, в приложении (не отдельно), есть еще один способ, которым вы можете обновить свой прогресс бар с помощью новой модели асинхронного программирования в C# 5 и платформы .NET 4.5. Это руководство может помочь вам:

Async, Await, Tasks, and UI synchronization with C# 5, .NET 4.5 and WinForms

Я также рекомендую вам прочитать о Task Parallel Library в .NET 4.0

Смежные вопросы