C# async + metro mahapp 进度环

C# async + metro mahapp progress ring

我的应用程序需要进度环和异步,因为 GUI 冻结。 我尝试了不同的设置 async/wait/task/task.运行 但 GUI 仍然冻结并且没有显示环并且 WaitRing.IsActive 在 Main 和 CS 中。 是的,我知道 ping 很快,但是当地址 IP 离线时,GUI 会冻结 4-5 秒。 当方法在 MainForm 中时,应用 async/await 更容易。从 Class 执行此操作时遇到问题,当来自 mahapp 的消息框需要等待时。

XAML:

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

CS:

public class DrukarkaPing { public 文本框 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;
}

第二CS:

   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;
            }
        }
    }

看来您误解了 async 和 await 背后的概念。

您执行的代码不是异步执行的,因为它没有打包在任务中。 如果您希望 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 了解有关该概念的一些信息