首页 文章

C#async metro mahapp进度环

提问于
浏览
0

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

XAML:

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

CS:

公共类DrukarkaPing {public TextBox TextBox_Drukarki_IP {get;组; }

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

}

Main:

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 回答

  • 2

    你似乎误解了异步和等待背后的概念 .

    您执行的代码不是异步执行的,因为它没有打包在Task中 . 如果您希望PING在Background中运行,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获取有关该概念的一些信息

相关问题