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 了解有关该概念的一些信息
我的应用程序需要进度环和异步,因为 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 了解有关该概念的一些信息