2017-11-29 6 views
0

GUIがフリーズするため、アプリケーションと非同期にプログレスリングが必要です。 私は別の設定async/wait/task/task.runを試しましたが、GUIはまだフリーズしていて、メインとCSではWaitRing.IsActiveが表示されません。 はい、私はpingが速いのは分かっていますが、アドレスIPがオフラインの場合、GUIは4-5秒間フリーズします。 メソッドがMainFormにある場合、async/awaitを適用する方が簡単です。 Classからこれを行うことに問題があり、mahappのメッセージボックスが待つ必要があるとき。C#async + metro mahapp progress ring

XAML:

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

CS:

パブリッククラスDrukarkaPing { 公共のTextBox 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)); 'タスクアクションの外に' Text'プロパティ値を取得することが重要です。 – Clemens

+0

GUIがフリーズするとプログレスリングが助けにならない(GUIがフリーズしていると言われているため)。主な問題は、あなたのSprawdz.CheckCSVがおそらくあなたのUI Thread.Howでhavyの仕事をしているということです。 – Console

+0

また、CheckPingメソッドのTRYブロック全体がASYNCではありません。 – Console

答えて

2

あなたが非同期の背景にある概念を誤解して待っているようです。

実行するコードはタスクにパックされていないため、非同期では実行されません。 PINGがバックグラウンドで実行されるようにするには、CheckPingメソッドがこのように表示されます。

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

はい。 しかし、 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

Clemens - 私は推測します @ Consoleこれで問題はありません。あなたのリンクを確認します:) – Hoshie