2017-11-29 17 views
0

GUI가 정지하기 때문에 응용 프로그램과 비동기에 진행률 링이 필요합니다. 다른 설정 async/wait/task/task.run을 시도했지만 GUI가 여전히 고정되어 있고 링이 나타나지 않고 Main과 CS에 WaitRing.IsActive가 있습니다. 예, 핑은 빠르지 만 주소 IP가 오프라인이면 GUI가 4-5 초 동안 고정되어 있습니다. 메서드가 MainForm에있을 때 async/await를 적용하는 것이 더 쉽습니다. Class에서이 작업을 수행하는 데 문제가 있으며 mahapp의 메시지 상자가 필요할 때가 있습니다.C# async + metro mahapp 진행 반지

XAML :

<Controls:ProgressRing x:Name="WaitRing" IsActive="False" Foreground="{DynamicResource AccentColorBrush}" /> 

CS :

공용 클래스 DrukarkaPing { 공공 텍스트 상자의 TextBox_Drukarki_IP {얻을; 세트; }

public async Task CheckPing(TextBox TextBox_Drukarki_IP) 
{ 

    try 
    { 
     if (TextBox_Drukarki_IP.Text == "" || TextBox_Drukarki_IP.Text == " ") 
     { 
      return; 
     } 
     else 
     { 
      Ping PingZapytanie = new Ping(); 
      PingReply PingOdp = PingZapytanie.Send(TextBox_Drukarki_IP.Text); 

      if (PingOdp.Status == IPStatus.Success) 
      { 
       TextBox_Drukarki_IP.Background = new SolidColorBrush(Colors.Green); 
      } 
      else 
      { 
      TextBox_Drukarki_IP.Background = new SolidColorBrush(Colors.Red); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     var window = Application.Current.Windows.OfType<MetroWindow>().FirstOrDefault(); 
     if (window != null) 
      await window.ShowMessageAsync("Błąd!", e.Message); 
     return; 
    } 

} 

홈페이지 :

private async void Button_Drukarki_Sprawdz_Click(object sender, RoutedEventArgs e) 
{ 
    WaitRing.IsActive = true; 

    TextBox_Drukarki_IPNS.Text = string.Join("", TextBox_Drukarki_IPNS.Text.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries)); 

    Drukowanie.Drukarka Sprawdz = new Drukowanie.Drukarka(TextBox_Drukarki_IPNS.Text); 
    await Sprawdz.CheckCSV(TextBox_Drukarki_IP, TextBox_Drukarki_NS, TextBox_Drukarki_Salon, TextBox_Drukarki_Terminal, TextBox_Drukarki_Status, TextBox_Drukarki_Serwer, 
    TextBox_Drukarki_Model, TextBox_Drukarki_Podlaczenie, TextBox_Drukarki_Lokalizacja); 

    DrukarkaPing Sprawdznext = new DrukarkaPing(); 
    await Sprawdznext.CheckPing(TextBox_Drukarki_IP); 

    WaitRing.IsActive = false; 
} 

SecondCS : 당신이 비동기의 개념을 잘못 이해하고 기다리고 보인다

class Drukarka 
    { 
     public TextBox TextBox_Drukarki_IPNS { get; set; } 
     public TextBox TextBox_Drukarki_IP { get; set; } 
     public TextBox TextBox_Drukarki_NS { get; set; } 
     public TextBox TextBox_Drukarki_Salon { get; set; } 
     public TextBox TextBox_Drukarki_Terminal { get; set; } 
     public TextBox TextBox_Drukarki_Status { get; set; } 
     public TextBox TextBox_Drukarki_Serwer { get; set; } 
     public TextBox TextBox_Drukarki_Model { get; set; } 
     public TextBox TextBox_Drukarki_Podlaczenie { get; set; } 
     public TextBox TextBox_Drukarki_Lokalizacja { get; set; } 

     public async Task CheckCSV(TextBox TextBox_Drukarki_IPNS, TextBox TextBox_Drukarki_IP, TextBox TextBox_Drukarki_NS, TextBox TextBox_Drukarki_Salon, TextBox TextBox_Drukarki_Terminal, TextBox TextBox_Drukarki_Status, 
      TextBox TextBox_Drukarki_Serwer, TextBox TextBox_Drukarki_Model, TextBox TextBox_Drukarki_Podlaczenie, TextBox TextBox_Drukarki_Lokalizacja) 
     { 
      try 
      { 
       if ((TextBox_Drukarki_IPNS.Text == "" || TextBox_Drukarki_IPNS.Text == " ")) 
       { 
        var window = Application.Current.Windows.OfType<MetroWindow>().FirstOrDefault(); 
        if (window != null) 
         await window.ShowMessageAsync("Błąd!", "Podaj numer seryjny!"); 
        return; 
       } 
       else 
       { 
        TextBox_Drukarki_IPNS.Text = string.Join("", TextBox_Drukarki_IPNS.Text.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries)); 

        Color Kolor = Color.FromRgb(37, 37, 37); 
        Color Kolor2 = Color.FromRgb(255, 160, 0); 

        TextBox_Drukarki_Terminal.Background = new SolidColorBrush(Kolor); 
        TextBox_Drukarki_Lokalizacja.Background = new SolidColorBrush(Kolor); 
        TextBox_Drukarki_Serwer.Background = new SolidColorBrush(Kolor); 
        TextBox_Drukarki_Salon.Background = new SolidColorBrush(Kolor); 
        TextBox_Drukarki_Podlaczenie.Background = new SolidColorBrush(Kolor); 
        TextBox_Drukarki_Status.Background = new SolidColorBrush(Kolor); 

        //TextFieldParser sprawdz = new TextFieldParser(@"C:\Users\Przemysław\OneDrive\Programowanie\wykaz_druk.csv"); 
        TextFieldParser sprawdz = new TextFieldParser(@"\\DSB192\Aplikacja_PrintFix$\Raporty\wykaz_druk.csv"); 
        string currentLine; 
        sprawdz.TextFieldType = FieldType.Delimited; 
        sprawdz.Delimiters = new string[] { ";" }; 
        sprawdz.TrimWhiteSpace = true; 
        bool czyjest = false; 

        do 
        { 
         currentLine = sprawdz.ReadLine(); 
         if (currentLine != null) 
         { 
          string file = currentLine; 

          string STATUS = file.Split(';')[0].Trim(); 
          string MODEL = file.Split(';')[1].Trim(); 
          string NS = file.Split(';')[2].Trim(); 
          string IPD = file.Split(';')[3].Trim(); 
          string SERWER = file.Split(';')[4].Trim(); 
          //string ??? = file.Split(';')[5].Trim(); kolejka 
          string UDZIAL = file.Split(';')[6].Trim(); 
          string LOKAL = file.Split(';')[7].Trim(); 
          string SALON = file.Split(';')[8].Trim(); 
          //string ??? = file.Split(';')[9].Trim(); lastcom 
          string PODLACZ = file.Split(';')[10].Trim(); 

          if (IPD == TextBox_Drukarki_IPNS.Text || NS == TextBox_Drukarki_IPNS.Text) 
          { 
           czyjest = true; 
\\ALOT CODE WITH FORWARDING TO TEXT.BOXES and few await window.ShowMessageAsync 

          } 
         } 
        } while (currentLine != null); 

        if (czyjest == false) 
        { 
         var window = Application.Current.Windows.OfType<MetroWindow>().FirstOrDefault(); 
         if (window != null) 
          await window.ShowMessageAsync("Błąd!", "Błędny numer seryjny!"); 
         return; 
        } 
       } 
      } 
      catch (Exception) 
      { 
       var window = Application.Current.Windows.OfType<MetroWindow>().FirstOrDefault(); 
       if (window != null) 
        await window.ShowMessageAsync("Błąd!", "Błąd pobierania danych."); 
       return; 
      } 
     } 
    } 
+1

'var에 t = TextBox_Drukarki_IP.Text을 시도; var PingOdp = Task.Run (() => PingZapytanie.Send (t)); 기다린다.'Task' 액션 밖에서'Text' 속성 값을 얻는 것이 중요하다. – Clemens

+0

GUI가 멈춘 경우 진행률 링이 도움이되지 않습니다 (GUI가 정지되었다고 말했기 때문에). 주요 문제는 Sprawdz.CheckCSV가 UI 스레드에서 하비 작업을하고있는 것입니다. 메서드가 수행하는 작업을 보여줄 수 있습니까? – Console

+0

또한 CheckPing 메서드의 전체 TRY 블록이 ASYNC가 아닙니다. – Console

답변

2

.

실행중인 코드는 작업에 압축되어 있지 않으므로 비동기로 실행되지 않습니다. PING을 백그라운드에서 실행하려면 CheckPing Method가 다음과 같아야합니다.

public async Task CheckPing(TextBox TextBox_Drukarki_IP) 
{ 
    try 
    { 
     var text = TextBox_Drukarki_IP.Text; // get TextBox.Text in UI thread 

     if (!string.IsNullOrWhiteSpace(text)) 
     { 
      //Now the Ping.Send is running in Background 
      PingReply PingOdp = await Task.Run(() => 
      { 
       Ping PingZapytanie = new Ping(); 
       return PingZapytanie.Send(text); 
      }); 

      //This code is running on the UI Thread again (because you access a FrameworkElement) 
      if (PingOdp.Status == IPStatus.Success) 
      { 
       TextBox_Drukarki_IP.Background = new SolidColorBrush(Colors.Green); 
      } 
      else 
      { 
       TextBox_Drukarki_IP.Background = new SolidColorBrush(Colors.Red); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     var window = Application.Current.Windows.OfType<MetroWindow>().FirstOrDefault(); 
     if (window != null) 
      await window.ShowMessageAsync("Błąd!", e.Message); 
     return; 
    } 
} 

당신은 개념에 대한 몇 가지 정보를 얻을 수 check here을해야

+0

예. Async/Wait 이해에 문제가 있습니다. (이 링크를 확인합니다.) return PingZapytanie.Send (TextBox_Drukarki_IP.Text); 다른 스레드가이 스레드를 소유하고 있기 때문에 호출하는 스레드가이 개체에 액세스 할 수 없습니다 – Hoshie

+0

@Hoshie Clemes가 내 버그를 수정했습니다. UI 스레드에 관한 ... 당신은 UI와 로직을 많이 섞어 놓고 있습니다. MVVM 학습에 시간을 투자 할 것을 권합니다. https://msdn.microsoft.com/en-us/library/hh848246.aspx – Console

+0

클레멘스 - 추측 컨데 이전 댓글을 이해하지 못했지만 작동하지 않았습니다. @ Console 이제 괜찮습니다. 링크를 확인해 보겠습니다. :) – Hoshie