我需要在我的应用程序和异步中进行响铃,因为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 回答
你似乎误解了异步和等待背后的概念 .
您执行的代码不是异步执行的,因为它没有打包在Task中 . 如果您希望PING在Background中运行,CheckPing方法应如下所示 .
您应该check here获取有关该概念的一些信息