Dostałem z uczelni zadanie, żeby napisać netstata w wersji okienkowej, z GUIem. Od zawsze odczuwam niechęć do wszystkiego, co jest związane z sieciami, więc uznałem że po prostu z poziomu C# włączę cmd, odpalę netstata i przekieruję do jakiegoś textboxa strumień wyjścia. Nawet mi się to udało, ale mam z tym jeszcze jeden, dosyć poważny problem.
private void Button_Click(object sender, RoutedEventArgs e)
{
rtb1.Document.Blocks.Clear();
rtb1.AppendText("Executing...");
Thread t = new Thread(new ThreadStart(Func));
t.Start();
int i = 0;
while (!jest) { Thread.Sleep(1000); rtb1.AppendText("--" + i + " "); i++; }
rtb1.AppendText(shared);
shared = "";
jest = false;
}
private void Func()
{
Process p = new Process();
p.StartInfo = new ProcessStartInfo("cmd", "/c netstat")// + shared)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
p.Start();
string s = p.StandardOutput.ReadToEnd();
//p.WaitForExit();
shared = s;
jest = true;
}
W kodzie mam coś takiego. Ten kod działa, ale niestety nie tak jak miałem nadzieję - pomimo odpalenia konsoli z drugiego wątku, okno się wiesza i nie można nic zrobić do momentu zakończenia wykonywania polecenia przez cmd. Próbowałem też skierować strumień wyjścia do pliku, żeby go później odczytać (operatorem >>), ale to też zamiast wysyłać po linijce, wysyła od razu cały kod wyjściowy. No i mam przez to dwa problemy - po pierwsze, przy niektórych parametrach szybko wypisuje kilka pierwszych linijek, a nad końcowymi się po kilka sekund zastanawia i wyjście dostaję dopiero na sam koniec, a nie częściowo. Drugim problemem jest to, że jeśli bym chciał użyć interwału, powstaje mi "pętla", która nigdy nie ma końca. Program się wiesza i czeka na koniec polecenia, a cmd czeka na ręczne zakończenie komendy. Jest jakiś sposób na obejście tego, żeby cmd mi dawał kod po linijce, czy muszę siąść nad tym i napisać wszystko z łapy?