GUI가 정지하기 때문에 응용 프로그램과 비동기에 진행률 링이 필요합니다. 다른 설정 async/wait/task/task.run을 시도했지만 GUI가 여전히 고정되어 있고 링이 나타나지 않고 Main과 CS에 WaitRing.IsActive가 있습니다. 예, 핑은 빠르지 만 주소 IP가 오프라인이면 GUI가 4-5 초 동안 고정되어 있습니다. 메서드가 MainForm에있을 때 async/await를 적용하는 것이 더 쉽습니다. Class에서이 작업을 수행하는 데 문제가 있으며 mahapp의 메시지 상자가 필요할 때가 있습니다.C# async + metro mahapp 진행 반지
XAML :
<Controls:ProgressRing x:Name="WaitRing" IsActive="False" Foreground="{DynamicResource AccentColorBrush}" />
CS :
공용 클래스 DrukarkaPing { 공공 텍스트 상자의 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;
}
}
}
'var에 t = TextBox_Drukarki_IP.Text을 시도; var PingOdp = Task.Run (() => PingZapytanie.Send (t)); 기다린다.'Task' 액션 밖에서'Text' 속성 값을 얻는 것이 중요하다. – Clemens
GUI가 멈춘 경우 진행률 링이 도움이되지 않습니다 (GUI가 정지되었다고 말했기 때문에). 주요 문제는 Sprawdz.CheckCSV가 UI 스레드에서 하비 작업을하고있는 것입니다. 메서드가 수행하는 작업을 보여줄 수 있습니까? – Console
또한 CheckPing 메서드의 전체 TRY 블록이 ASYNC가 아닙니다. – Console