2016-12-16 5 views
0

I um 100 Remote-Server haben und unten, wie ich versuche, einige Dateien von meinem PC auf alle diese Remote-Server zu kopieren, aber ich möchte einige Kontrollen tunKopieren von Dateien auf Remote-Server überprüft

1- Check wenn die Verbindung zum Remote-Server verfügbar ist, wenn nicht geht dann zum nächsten Büro

2-für Benutzer-Interaktion

a- ich bei datagridview1 zu Farbe ausgewählte Zeile versuchen bei Whcih Büro zu informieren, Benutzer des Fortschritt ist jetzt und alos unter datagridview2 die gleiche Sache, um Benutzer wissen zu lassen, in welcher Datei der Fortschritt ist jetzt in bestimmten Büro, aber die Schnittstelle einfrieren nach dem Start der Datei zu senden und keine Interaktion passieren, was zu tun ist?

b-wie wird die fertige Bürozeile bei grün eingefärbt, wenn erfolgreich?

aktualisiert

I Form so das Feedback an Benutzer aber Problem wird nicht wieder gelöst und noch passieren und nichts ändern bitte, was soll ich tun Einfrieren lösen verwendet Threading ???

public void PatchUpdates() 
{ 
    try 
    { 
     foreach (DataGridViewRow OfficeListRow in DGV_OfficeList.Rows) 
     { 
      string OfficeIPAddress = OfficeListRow.Cells[2].Value.ToString(); 

      foreach (DataGridViewRow FileListRow in DGV_FileList.Rows) 
      { 
       string SoruceFileNamePath = FileListRow.Cells[4].Value.ToString(); 
       string DestinationFileNamePath = @"\\" + OfficeIPAddress + @"\usb1_1\test\" + Path.GetFileName(SoruceFileNamePath); 


       Thread foregroundthread = new Thread(() => CheckOffice(OfficeIPAddress)); 

       foregroundthread.Start(); 

       //check if connection to remote server is available 
       if (CheckOffice(OfficeIPAddress) == 1) 
       { 
        DGV_OfficeList[3, DGV_OfficeList.CurrentCell.RowIndex].Value = "Connected"; 
        //file.copy(sorucefilenamepath, destinationfilenamepath, true); //copy files... 
       } 
       else if (CheckOffice(OfficeIPAddress) == 0) 
       { 
        DGV_OfficeList[3, DGV_OfficeList.CurrentCell.RowIndex].Value = "disconnected"; 
        break; 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

Prüfung Verbindungsmethode

public int CheckOffice(string _ipAddress) 
{ 
    int timeout = 120; 
    string data = "PingTestData"; 
    byte[] buffer = Encoding.ASCII.GetBytes(data); 

    Ping PingSender = new Ping(); 
    PingOptions options = new PingOptions(); 

    options.DontFragment = true; 

    PingReply reply = PingSender.Send(_ipAddress, timeout, buffer, options); 

    if (reply.Status == IPStatus.Success) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

enter image description here

Antwort

0

, dass viele Fragen sind, und ich denke, dass es keine gute Idee ist, sie in einem Beitrag zu setzen. Aber trotzdem konnte ich einen Teil davon beantworten: 1- Ich denke, dass Ihre Netzwerkprüfung nicht funktioniert. Die Methode "GetIsNetworkAvailable" überprüft nur, ob Ihr Computer mit dem Netzwerk verbunden ist oder nicht. Sie müssen einen "Ping" oder Ähnliches ausführen (MSDN Ping class). Übrigens. Wenn Sie nach der Erkennung eines Netzwerkfehlers "return" verwenden, verlassen Sie die Methode. Verwenden Sie stattdessen "break", um nur die innere Schleife zu verlassen.

2- Wie in Ihrem Link beschrieben, ist File.Copy erfolgreich oder löst eine Ausnahme aus. Also sollte der dort beschriebene Weg in Ordnung sein.

3- Um den Fortschritt anzuzeigen, müssen Sie einen Hintergrund-Worker-Thread verwenden (BackgroundWorker).

+0

hatte ich meinen Beitrag aktualisieren mit dem Scheck Ping-Klasse jetzt ich habe Problem, dass das Ergebnis in Datagridview zurückgegeben wird, ist nicht korrekt Die meiste Zeit und manchmal der ganze PC einfrieren und neu starten ... Gibt es irgendetwas, was Sie vorschlagen, dass cheque reomte server check part? – sam

+0

@ Sam: Ergebnis im Hinblick auf Datenraster ist nicht korrekt -> Ausführen in foreach-Schleife nicht die aktuelle Zelle des Gridview ändern, die durch die Ping-Antwort aktualisiert wird –

+0

@ Sam PC Einfrieren und Wiederanlauf -> Welches Betriebssystem verwenden Sie? Dies sollte nicht durch normalen Anwendungscode auf Systemen geschehen, auf denen Windows NT 4 oder höher ausgeführt wird. –

0

Ich vermute, dass PatchUpdates aus dem GUI-Thread aufgerufen wird. Wenn Sie die Datei DataGridViewRow.Selected in der Schleife aktualisieren, in der Sie die Dateien kopieren, wird die GUI diese Änderung niemals widerspiegeln, da Ihre Funktion noch nicht zurückgegeben wurde. Es gibt ein paar Möglichkeiten, damit umzugehen.

  1. (Hackiest, aber schnellster) Ruf Application.DoEvents() nach der DataGridViewRow.Selected Änderung
  2. (Reiniger Lösung, aber mehr Anstrengungen) Führen Sie diese Verarbeitung in einem Hintergrundthread und wechselt Thread zu GUI über die GUI der Control.BeginInvoke() Methode zu aktualisieren.

nun anders als das, es gibt Haufen Probleme in Ihrem Code:

Die folgende Zeile ändert sich nicht, sondern wird in einer Schleife ständig zu überprüfen, ob Ihre Netzwerkverbindung fallen gelassen wird oder nicht genannt. Es könnte sein, was Sie eigentlich brauchen, aber es war irgendwie ein Fehler.Vielleicht möchten Sie die Klasse Ping verwenden, um zu überprüfen, ob die Maschine verfügbar ist?

if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) 

Sie haben nur den Wert umgeschaltet, wahrscheinlich ohne Grund. Vielleicht haben Sie nur versucht, Ihre Lösung zu debuggen. Oder vielleicht wollte man eigentlich die Linie zu blinken, aber das wird nicht mit diesem Code passiert

OfficeListRow.Selected = true; 
OfficeListRow.Selected = false; 
+0

zuerst, wenn Sie von PatchUpdates ist cmd Patch-Datei meinen ich bereits für diesen Prozess Patch-Datei jetzt bin mit, aber ich will, was verbessern besser zu machen, damit ich auf C# Projekt arbeitete – sam

+0

zweiten weiß, dass ich nichts über Einfädeln bitte Smal geben würde etwas dagegen, Beispiel? was die anderen Fragen in meinem Code bitte lassen Sie mich wissen, kranke Arbeit an ihnen .. danke – sam

+0

wie Sie vorschlagen, um die Überprüfung der Remote-Server-Verfügbarkeit zu machen? da ich meinen post updaten musste und die ping-klasse vorerst benutzt ... und ja, das was ich wirklich überprüfen möchte ist die verbindung oder nicht so ille strat copy für den nächsten server und nicht auf einem server gestapelt und das bessere ist es auf alle Server gleichzeitig kopieren – sam

Verwandte Themen