2017-01-26 10 views
-2

Я новичок в C#, и я пытаюсь написать код, который выполняет последовательную связь с другим оборудованием. Я использую async/жду, чтобы выполнить эту работу. но я хочу обновить индикатор выполнения из ожидаемого метода, считая, что мой метод находится в другом классе с именем class1 и существует в файле class1.cs, прикрепленном к решению. У меня есть один текстовый блок, один индикатор выполнения и одна кнопка запуска в коде XAML.Обновление пользовательского интерфейса от ожидаемого метода другого класса в приложении универсальных окон

Как обновить «progressbar1» из метода «DummyWork» в классе «Class1»?

Буду признателен, если кто-то может мне помочь в этом вопросе. Мой шаблон кода выглядит следующим образом.

MainPage.xaml.cs содержание:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using System.Threading.Tasks; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 
using System.Threading; 
using uwptestapp1classes; 

namespace uwptestapp1 
{ 
    public sealed partial class MainPage : Page 
    {  
     public MainPage() 
     { 
      this.InitializeComponent(); 
      textBlock.Text = string.Empty; 
     } 

     private async void startBtn_Click(object sender, RoutedEventArgs e) 
     { 
      int asyncResult = 0; 
      progressbar1.Value = 0; 
      startBtn.IsEnabled = false; 
      textBlock.Text += "button press log: " + startBtn.Content + " button is pressed" + Environment.NewLine; 
      DateTime previousTime = DateTime.Now; 
      asyncResult = await Task.Run(() => Class1.DummyWork(previousTime)); 
      textBlock.Text += "Task have been done" + Environment.NewLine; 
      startBtn.IsEnabled = true; 
     } 
    } 
} 

Class1.cs содержание:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.UI.Xaml.Controls; 
using System.Threading; 

namespace uwptestapp1classes 
{ 
    public class Class1 
    { 
       public static int DummyWork(DateTime previoustime) 
     { 
      for (int i = 0; i <= 100;) 
      { 
       if ((DateTime.Now - previoustime).Milliseconds >= 500) 
       { 
        /* UI update code 
        * update "progressbar1.value" 
        */ 
        previoustime = DateTime.Now; 
       } 

       //delay without using task.delay 
       for (int myCounter = 0; myCounter < 50000000;) 
       { 
        myCounter++; 
       } 
      } 
      return 1; 
     } 
    } 
} 
+2

У меня вопрос не возникает. Пожалуйста, см. [Почему «Может ли кто-нибудь помочь мне?» не вопрос?] (http://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question) – BradleyDotNET

+0

@BradleyDotNET Спасибо за ваш комментарий. Я обновил свой точный вопрос. – Arash

+1

[Похоже, вы не проводили много исследований по этому вопросу) (https://www.google.com/?gws_rd=ssl#q=uwp+progress+bar+from+task+c%23). У вас есть? – Romasz

ответ

1

сообщить о прогрессе из куска кода, вы должны использовать IProgress<T>:

public class Class1 
{ 
    public static int DummyWork(DateTime previoustime, IProgress<DateTime> progress = null) 
    { 
    for (int i = 0; i <= 100;) 
    { 
     if ((DateTime.Now - previoustime).Milliseconds >= 500) 
     { 
     progress?.Report(DateTime.Now); 
     } 

     //delay without using task.delay 
     for (int myCounter = 0; myCounter < 50000000;) 
     { 
     myCounter++; 
     } 
    } 
    return 1; 
    } 
} 

Чтобы получить прогресс, вы можете использовать Progress<T>:

public sealed partial class MainPage : Page 
{  
    private async void startBtn_Click(object sender, RoutedEventArgs e) 
    { 
    int asyncResult = 0; 
    progressbar1.Value = 0; 
    startBtn.IsEnabled = false; 
    textBlock.Text += "button press log: " + startBtn.Content + " button is pressed" + Environment.NewLine; 
    DateTime previousTime = DateTime.Now; 
    var progress = new Progress<DateTime>(time => 
    { 
     progressbar1.value = ...; 
    }); 
    asyncResult = await Task.Run(() => Class1.DummyWork(previousTime, progress)); 
    textBlock.Text += "Task have been done" + Environment.NewLine; 
    startBtn.IsEnabled = true; 
    } 
} 
+0

Большое вам спасибо. Что значит "?" означает «прогресс» .Report (DateTime.Now); '? – Arash

+0

Это означает, что вызывается только 'Report', если' progress' не 'null'. –