Laden...

Forenbeiträge von csharp-user Ingesamt 63 Beiträge

02.10.2017 - 12:14 Uhr

Ich muss mit Regex irgendwie {"username": "Mueller"}, die auch mehrmals in diesem string vorkommt auslesen und anschließend mit substring den User filtern. Mir fällt nur der Regulärer Ausdruck.

Gibt es ein online Regex Generator? Man gibt das Suchmuster ein und der Generator generiert den Ausdruck.

02.10.2017 - 11:49 Uhr

Dank für den Link.

Ich habe vorhin mit

Regex reg = new Regex(@"/ {.username.: /g");

probiert, aber ohne Erfolg. Ich glaube, dass das Ganze etwas komplizierte ist, als ich gedacht habe.

02.10.2017 - 10:47 Uhr

Hallo zusammen,

ich habe eine string Variable, die ca. 200 HTML Zeilen beinhaltet. Wie kann ich in diesem String nach einem Muster suchen, das mehrmals in diesem String vorkommt? Ich möchte anschließend ein Teil von diesem Muster filtern und in ein StringBuilder oder in eine Datei speichern.

Zum Beispiel:

Die String Variable beinhaltet n „username“, die ich filtern möchte:

Text bla bla {"username": "Mueller"} bla bla
Text bla bla {"username": "Meyer"} bla bla
Text bla bla {"username": "Becker"} bla bla

Wie bekomme ich nun so eine Liste?

Mueller
Meyer
Becker

Vielen Dank im Voraus.

07.11.2016 - 15:18 Uhr

Hier ist die Lösung:

Das Ganze muss in der Methode treeView1_AfterSelect definiert werden:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
treeView1.SelectedNode = node;
treeView1.SelectedNode.EnsureVisible();
treeView1.SelectedNode.Checked = true;
treeView1.Focus();
}

07.11.2016 - 14:33 Uhr

Hallo zusammen,

es geht um eine TreeView mit ein paar Nodes und unter Nodes.

Beispiel:
TreeView:
Node 1
-->node 1.1
Node 2
-->node 2.1
Node 3
-->node 3.1
Node 4
-->node 4.1

Der User wählt node 3.1 aus. Danach wird ein Prozess gestartet, der etwas bearbeiten muss. In der Zeit darf der User den Node nicht verlassen. Wenn der User einen anderen Node auswählt, dann bekommt er zur Ansicht eine MessageBox. Nachdem er die MessageBox bestätigt hat, soll der node 3.1 wieder in der TreeView selektiert werden. Folgender Code funktioniert leider nicht:

//Den aktuellen Node in einer event Methode merken
TreeNode node = treeView1.SelectedNode;

//Nach der MessageBox soll der Fokus auf node 3.1 gesetzt werden
treeView1.SelectedNode = node;
treeView1.SelectedNode.EnsureVisible();
treeView1.Focus();

Vielen Dank im Voraus für die Hilfe.

10.10.2016 - 16:29 Uhr

Danke, es hat funktioniert.

string path = @"\\" + RemotePC + @"\c$";
10.10.2016 - 16:16 Uhr

Hallo zusammen,

ich möchte gerne mit explorer eine versteckte Freigabe von einem Remote-PC öffnen. Es funktioniert irgendwie nicht, weil das Backslash \ zweimal vorkommt!

string path = "\\RemotePC\\C$";

Process.Start("explorer.exe", path);

Ich habe auch so probiert, aber ohne Erfolg:


string path = @"\\RemotePC\\C$";

Process.Start("explorer.exe", path);

Die Variable path sollte eigentlich so aussehen: \RemotePC\C$ und NICHT so: \RemotePC\C$

Wie bekomme ich nur ein Backslash vordem C$ hin?

Danke.

29.09.2016 - 15:58 Uhr

Nein. Alle sind Windows Server 2012. Alle sind identisch. Es gibt bestimmt eine Möglichkeit, um das CMD Fenster eines Remote-PCs lokal anzeigen. Firewall ist auf jedem Server deaktiviert.

29.09.2016 - 13:46 Uhr

Also, es geht um folgendes:

Ich habe in meinem C# Programm eine Liste von Windows Server, die sich im LAN befinden.
Ich möchte gerne einen Server aus der Liste auswählen und anschließend ein PowerShell mit folgender Commands starten:

Enter-PSSession -ComputerName <Servername>

Wenn das PowerShell Fenster da ist, dann bin ich direkt auf dem Zielserver. Ich kann natürlich händisch, also ohne C# ein PowerShell öffnen und die o.g. Commands eingeben, aber ich möchte es aus dem C# Programm PowerShell starten, da ich vorher die notwendigen Commands mit übergeben kann. Das muss auch nicht unbedingt PowerShell sein. Ein remote CMD ist auch ok. Ich habe gerade mit dem PsExec.exe \<Servername> cmd probiert. Es funktioniert aber nicht auf jedem Windowsserver! Also, ich benötige eine remote Console (cmd oder PowerShell) zu einem Server.

29.09.2016 - 13:12 Uhr

Danke. Diese Seite habe ich auch entdeckt. 😃

Mit newProcessInfo.Verb = "runas"; wird das PowerShell als Administrator ausgeführt. Ich muss nur herausfinden, wie man PowerShell startet und vorher mit Commands füttert.

29.09.2016 - 11:38 Uhr

Ich kann nun PowerShell Fenster starten, aber ich weiß nicht, wie man Commands mitgeben kann!

var newProcessInfo = new System.Diagnostics.ProcessStartInfo();
newProcessInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe";
newProcessInfo.Verb = "runas";
//newProcessInfo.Arguments = @"cd\"; ---------> Wenn ich diese Zeile aktiviere, dann wird das PowerShell Fenster nach dem Start sofort geschlossen!?!
newProcessInfo.RedirectStandardOutput = true;
newProcessInfo.UseShellExecute = false;
newProcessInfo.CreateNoWindow = false;
System.Diagnostics.Process.Start(newProcessInfo);
29.09.2016 - 11:02 Uhr

Hallo zusammen,

ich habe eine kurze Frage:

Wie kann ich das PowerShell Fenster als Admin über C# aufrufen? Ich möchte aber vorher ein paar Commands einbauen bzw. übergeben, bevor das PowerShell Fenster auf dem Desktop erscheint.

Ich habe folgendes probiert, aber kein PowerShell Fenster wird auf dem Bildschirm geöffnet!

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process");
ps.Invoke(); 

Ich möchte gerne anschließend in diesem PowerShell Fenster manuell weiterarbeiten.

Danke.

21.09.2016 - 12:33 Uhr

Ich habe gerade RegistryKey.OpenRemoteBaseKey probiert. Ich dachte, dass ich so den Zugriff testen kann. Pustekuchen. Wenn ich den PC herunterfahre, dann dauert es eine Minute, bis OpenRemoteBaseKey eine IOException wirft!

21.09.2016 - 11:24 Uhr

Was steht in dessen InnerException? Fehlermeldung:
[System.UnauthorizedAccessException] = {"Der Zugriff auf den Registrierungsschlüssel &quot;238&quot; wurde verweigert."}

Jetzt muss ich nur herausfinden, wie man vor dem Aufruf der Methode den Zugriff auf den Registrierungsschlüssel prüfen kann!

21.09.2016 - 11:09 Uhr

Hi!

Sorry, Du hast recht. COMException gehört nicht dazu.

Du schaltest den PC aus und er antwortet trotzdem auf einen Ping?

Ja, es dauert halt etwas bis der PC herunterfährt. Zuerst werden doch die Dienste gestoppt. In dieser Zeit ist der PC noch pingbar.

Danke für den Link. Ich schaue gleich dort nach, ob ich den Dienst finde.

Fehlermeldung:
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.COMException" ist in System.Management.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.
bei Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str)
bei Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity)
bei Microsoft.Win32.RegistryKey.GetValue(String name)
bei System.Diagnostics.PerformanceMonitor.GetData(String item)
bei System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item)
bei System.Diagnostics.PerformanceCounterLib.GetCategorySample(String category)
bei System.Diagnostics.PerformanceCounterLib.GetCategorySample(String machine, String category)
bei System.Diagnostics.PerformanceCounter.NextSample()
bei System.Diagnostics.PerformanceCounter.NextValue()

21.09.2016 - 10:47 Uhr

Hallo zusammen,

ich habe eine kurze Frage.

Ich verwende PerformanceCounter, um die CPU Werte eines Remote-PCs auszulesen.
Der Code sieht so aus:

private PerformanceCounter cpuCounter;

this.cpuCounter = new PerformanceCounter();
this.cpuCounter.CategoryName = "Processor";
this.cpuCounter.CounterName = "% Processor Time";
this.cpuCounter.InstanceName = "_Total";
this.cpuCounter.MachineName = „PC-Name“;
this.cpuCounter.BeginInit();

Der Aufruf in einer Methode sieht so aus:

float cpuUsage = this.cpuCounter.NextValue();

Ich habe den Remote-PC (Windows Server 2012) absichtlich ausgeschaltet, um zu sehen, was genau passiert. Sobald ich den PC herunterfahre, bekomme ich von der Methode NextValue extrem schnell folgende Exceptions:

System.Runtime.InteropServices.COMException
System.UnauthorizedAccessException

Wie heißt der verantwortliche Dienst auf dem Remote-PC für die PerformanceCounters? Ich möchte gerne vor dem Aufruf der Methode NextValue() prüfen, ob der Dienst auf dem Remote-PC antwortet oder nicht. Ich habe mit dem Pingen probiert, aber es bringt nicht viel, weil der Remote-PC noch über Ping erreichbar ist. Die Dienste werden natürlich vorher gestoppt, bevor der Rechner endgültig runterfährt.

Danke.

19.09.2016 - 19:48 Uhr

Danke. Ehrlich gesagt, es hat auch mit der Klasse Progress <T> super funktioniert. Aber man hier im Forum den Timer empfohlen. Ich habe angefangen die Tasks durch Timer zu ersetzen. Soweit funktioniert es auch, aber sobald ich versuche in einem Timer die Auslastung einer Remote-Festplatte via WMI auszulesen, reagiert die Anwendung nicht mehr, bis die Daten da sind. Ansonsten werden die anderen Werte, wie z.B CPU und RAM ohne Probleme ausgelesen und die Anwendung bleibt nicht hängen. Vielleicht gibt es eine andere Möglichkeit, um die Auslastung einer Remote-Festplatte auszulesen! Ich werde morgen nachschauen.

19.09.2016 - 15:28 Uhr

Jetzt ist gut. Vielen Dank an Euch allen. Ihr habt mir wirklich weitergeholfen. 👍

19.09.2016 - 14:26 Uhr

Ich kann natürlich die Methode

updateLabelHDDDiskTime

außerhalb des Timers aufrufen, aber dann bekomme ich folgende Meldung:

"System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

Ich dachte, dass die Timer Klasse eine Möglichkeit bietet, damit man ihn am Anfang sofort startet und nicht nach dem Ablauf der Zeit!

19.09.2016 - 14:17 Uhr

Danke für die Korrektur.

Nochmal für mein Verständnis:

Also, wenn ich den Timer starte, dann wird alle 15 Sekunden die Methode PercentDiskTimerOnElapsed aufgerufen. Ist das richtig?


this.percentDiskTimer.Elapsed += PercentDiskTimerOnElapsed;
this.percentDiskTimer.Interval = 15000;
this.percentDiskTimer.AutoReset = true;
this.percentDiskTimer.Start();

Diese Zeile funktioniert es nicht: Das Zeichen $ kann auch nicht interpretiert werden. Woher weiß diese Methode, was das Objekt cimObj ist?

PerformThreaded(() => labelHDDDiskTime.Text = $"{cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value}%");

Danke.

19.09.2016 - 12:14 Uhr

Hi Abt,

danke für den Tipp.

Ich habe es so umgestellt und es funktioniert:

Aufruf der Methode:


this.updateLabelHDDDiskTimeTick();
        private void updateLabelHDDDiskTime(IEnumerable<CimInstance> cimObj)
        {
            this.Invoke(new Action(delegate()
            {
                this.labelHDDDiskTime.Text = Convert.ToString(cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value) + "%";
            }));
        }


        private void updateLabelHDDDiskTimeTick()
        {
            string device = string.Empty;
            string deviceName = string.Empty;

            List<string> deviceList = this.osService.getDeviceList();

            // Das zweite Laufwerk, wie z.B. D:
            if (deviceList.Count > 1)
            {
                deviceName = deviceList.ElementAt(1);
                device = "'1 " + deviceName + "'";
            }
            else
            {   //Laufwerk C:
                deviceName = deviceList.ElementAt(0);
                device = "'0 " + deviceName + "'";
            }

            IEnumerable<CimInstance> cimObj = this.osService.getPerfDisk(device);

            this.labelHDDDevice.Text = deviceName;

            this.percentDiskTimer.Interval = 15000;
            this.percentDiskTimer.AutoReset = true;

            this.percentDiskTimer.Elapsed += (s, ea) =>
            {
                if (this.InvokeRequired)
                {
                    this.updateLabelHDDDiskTime(cimObj);
                }
            };
            this.percentDiskTimer.Start();
        }

Ich habe noch eine kleine Frage:

Das Intervall für den Timer beträgt in meinem Fall 15 Sekunden. Wenn ich den Timer mit der Methode Start starte, dann dauert es am Anfang genau 15 Sekunden bis der Timer gestartet wird! Wie kann ich den Timer beim ersten Lauf sofort starten?

19.09.2016 - 11:12 Uhr

Es sieht so aus, dass es so funktioniert:

this.percentDiskTimer.Elapsed += (s, ea) =>
{
       Invoke(new Action(delegate()
       {
            this.labelHDDDiskTime.Text = Convert.ToString(cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value) + "%";
        }));
 };

Ich hoffe, dass diese Lösung keine Nebeneffekte hat!

19.09.2016 - 11:03 Uhr

Ich verwende ein UserControl mit 7 Komponenten. Diese Komponenten müssen in getrennten Threads aktualisiert werden. Diese Threads benötigen schon ein paar Sekunden, um sich die Daten im Netz zu holen. Wenn ich System.Windows.Forms.Timer verwende, dann friert alles ein. Aus diesem Grund müssen die Komponenten in UserControl in einem separaten Thread bzw. in einem Nebenthread laufen und nicht im GUI Thread.

19.09.2016 - 09:16 Uhr

Guten Morgen zusammen,

ich versuche gerade den Timer zu verwenden, aber ich bekomme folgende Exception, weil ich natürlich versuche aus einem Nebenthread auf den Hauptthread zuzugreifen. Ich möchte gerne aus meine Timer den Text von

this.labelHDDDiskTime.Text

zusetzen.

Ungültiger threadübergreifender Vorgang.

So sieht der Code aus:

System.Timers.Timer percentDiskTimer = new System.Timers.Timer();

void getHDDStatus()
{
	IEnumerable<CimInstance> cimObj = this.osService.getPerfDisk(device);
	
	this.percentDiskTimer.Interval = 15000;
	this.percentDiskTimer.AutoReset = true;

	this.percentDiskTimer.Elapsed += (s, ea) =>
	{
		this.labelHDDDiskTime.Text = Convert.ToString(cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value) + "%";
	};
				
	this.percentDiskTimer.Start();
}

Ich gehe davon aus, dass eine Kleinigkeit noch fehlt!

16.09.2016 - 15:58 Uhr

OK. Ich werde alle Tasks durch den Timer ersetzen und melde mich, wenn ich fertig bin.

16.09.2016 - 15:32 Uhr

OK. Ich werde das Ganze auf Timer umstellen.

16.09.2016 - 15:12 Uhr

Hallo ErfinderDesRades,

es sieht so aus, dass es mit Progress<T> funktioniert. 🙂 Bitte sei so nett und schau Dir die zwei Methoden kurz an. Habe ich noch was vergessen oder kann ich es so belassen? Ich habe nur einmal eine CimException bekommen! Ich habe die ganze Zeit die Tasks mit der Methode

Cancel()

der Klasse CancellationTokenSource geschlossen. Wie kann ich jetzt die Endlosschleifen (Progress<T>) bei den UserControls beenden? Muss ich dafür ein Flag setzen und es in der Endlosschleife abfragen?
Wie soll ich am besten diese zwei Methoden in meiner Start() Methode aufrufen?

So:

this.setDeviceLabel();
this.setPercentDiskTimeLabel();

oder so:

Task.Factory.StartNew(setDeviceLabel);
Task.Factory.StartNew(setPercentDiskTimeLabel);
        
async void setDeviceLabel()
{
    string device = string.Empty;
    string deviceName = string.Empty;

    var progressHandler = new Progress<string>(value =>
    {
         this.labelHDDDevice.Text = value;
     });
     var progress = progressHandler as IProgress<string>;
     await Task.Run(() =>
     {
          if (progress != null)
          {
               List<string> deviceList = this.osService.getDeviceList();

               // Das zweite Laufwerk, wie z.B. D:
                if (deviceList.Count > 1)
                {
                     deviceName = deviceList.ElementAt(1);
                     this.device = "'1 " + deviceName + "'";
                 }
                  else
                  {   //Laufwerk C:
                        deviceName = deviceList.ElementAt(0);
                        this.device = "'0 " + deviceName + "'";
                  }

                 progress.Report(deviceName);
                }
                Thread.Sleep(100);
            });        
        }



async void setPercentDiskTimeLabel()
{
     var progressHandler = new Progress<string>(value =>
     {
            this.labelHDDDiskTime.Text = value;
      });
      var progress = progressHandler as IProgress<string>;
      await Task.Run(() =>
      {
          IEnumerable<CimInstance> cimObj = this.osService.getPerfDisk(this.device);

          for ( ; ; )
          {
               if (progress != null)
               {
                    if (this.isServerON)
                    {
                        try
                        {
                             progress.Report(Convert.ToString(cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value) + "%");
                        }
                        catch (CimException ex)
                        {
                                Debug.Print(ex.StackTrace);
                        }
                      }
                      else
                      {
                            progress.Report("---");
                       }
                    }
                    Thread.Sleep(10000);
                }
            });        
        }
16.09.2016 - 13:19 Uhr

Danke, ich werde mir die Klasse Progress<T> anschauen.

16.09.2016 - 12:34 Uhr

Du hast vollkommen recht. Das habe ich mir fast gedacht. Habe ich richtig verstanden, dass ein Timer auf UI Elemente zugreifen darf oder? Wenn es so ist, dann werde ich alle Tasks in meinem UserControl durch ein paar Timers ersetzen. Dadurch brauche ich keine async Methoden mehr!

16.09.2016 - 12:28 Uhr

Danke.

Wenn ich

this.labelHDDDevice.Text = deviceName; 

ohne Task verwende, dann bekomme ich eine Exception Threadübergreifender Zugriff... Nachdem ich so realisiert habe, funktioniert es ohne Exception.

Task taskHDDLabel = new Task(() =>
{
      this.labelHDDDevice.Text = deviceName;
}, this.ct);

Ich werde versuchen die Tasks nach und nach durch einen Timer zu ersetzen, falls es Timer wirklich besser ist.

16.09.2016 - 11:37 Uhr

Ich habe folgende Änderung vorgenommen, aber es funktioniert leider immer noch nicht! Die UserControls frieren Beim Aufbau ein! Irgendetwas fehlt hier noch!

async Task workerHDDStatus()
{
    await Task.Run(() => getHDDStatusAsync());            
}

        void getHDDStatusAsync()
        {
            string device = string.Empty;
            string deviceName = string.Empty;

            List<string> deviceList = this.osService.getDeviceList();

            // Das zweite Laufwerk, wie z.B. D: oder H:
            if (deviceList.Count > 1)
            {
                deviceName = deviceList.ElementAt(1);
                device = "'1 " + deviceName + "'";
            }
            else
            {   //Laufwerk C:
                deviceName = deviceList.ElementAt(0);
                device = "'0 " + deviceName + "'";
            }

            IEnumerable<CimInstance> cimObj = this.osService.getPerfDisk(device);

            Task taskHDDLabel = new Task(() =>
            {
                this.labelHDDDevice.Text = deviceName;
            }, this.ct);

            if (taskHDDLabel.Status != TaskStatus.Canceled && taskHDDLabel.IsCompleted == false)
            {
                taskHDDLabel.Start(ts);
                taskHDDLabel.Wait();
            }
            for (; ;)
            {
                try
                {
                    if (this.source.IsCancellationRequested)
                    {
                        return;
                    }

                    if (this.isServerON)
                    {
                        Task t = new Task(() =>
                        {

                            this.labelHDDDiskTime.Text = Convert.ToString(cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value) + "%";

                        }, this.ct);

                        if (t.Status != TaskStatus.Canceled && t.IsCompleted == false)
                        {
                            t.Start(ts);
                            t.Wait();
                        }
                    }
                    else
                    {
                        this.labelHDDDiskTime.Text = "---";
                    }
                }
                catch (Exception ex)
                {
                    Task taskException = new Task(() =>
                    {

                        Debug.Print(ex.Message);
                    });

                    if (taskException.Status != TaskStatus.Canceled && taskException.IsCompleted == false)
                    {
                        taskException.Start(ts);
                        taskException.Wait();
                    }
                }

                Thread.Sleep(10000);
            }
        }
16.09.2016 - 10:40 Uhr

Hallo zusammen,

ich benötige eure Hilfe im Bereich async und await. Ich stehe gerade auf dem Schlauch!

Ich habe zwei Klassen:

Klasse 1 beinhaltet 2 Methoden, die ich das Ergebnis der zweiten Methode in einer Endlosschleife asynchron aufrufen möchte. Die zweite Klasse ist eigentlich ein UserControl. Es gibt zum Schluss 10 UserControls, die parallel laufen müssen.


Klasse 1:

//Methode 1
public List<string> getDeviceList()
{
  List<string> deviceList = new List<string>();

      try
      {
           ObjectQuery query = new ObjectQuery("SELECT DeviceID FROM Win32_LogicalDisk where drivetype=3");
           ManagementObjectSearcher searcher = new ManagementObjectSearcher(this.managementScope, query);
           ManagementObjectCollection queryCollection = searcher.Get();

           foreach (ManagementObject m in queryCollection)
           {
               deviceList.Add(m["DeviceID"].ToString());
           }
      }
      catch (Exception e)
      {
           Debug.Print(e.StackTrace);
      }

      return deviceList;
 }
 
//Methode 2
public IEnumerable<CimInstance> getPerfDisk(string pDevice)
{
     CimSession session = CimSession.Create(this.serverName);
     IEnumerable<CimInstance> queryInstance = session.QueryInstances(@"root\cimv2", "WQL", "SELECT PercentDiskTime FROM Win32_PerfFormattedData_PerfDisk_PhysicalDisk where name= " + pDevice);

     return queryInstance;
}

Klasse 2 bzw. UserControl:

void workerHDDStatus()
{
    string device = string.Empty;
    string deviceName = string.Empty;

    List<string> deviceList = this.osService.getDeviceList();
            
     // Das zweite Laufwerk, wie z.B. D:
     if (deviceList.Count > 1)
     {
         deviceName = deviceList.ElementAt(1);
         device = "'1 " + deviceName + "'";
     }
     else
     {   //Laufwerk C:
          deviceName = deviceList.ElementAt(0);
          device = "'0 " + deviceName + "'";
     }

     IEnumerable<CimInstance> cimObj = this.osService.getPerfDisk(device);
     Object thisLock = new Object();


     Task taskHDDLabel = new Task(() =>
     {
             this.labelHDDDevice.Text = deviceName;
      }, this.ct);

      if (taskHDDLabel.Status != TaskStatus.Canceled && taskHDDLabel.IsCompleted == false)
      {
            taskHDDLabel.Start(ts);
            taskHDDLabel.Wait();
      }

      for (; ;)
      {
          try
          {
               if (this.source.IsCancellationRequested)
               {
                     return;
               }

                if (this.isServerON)
                {
                    Task t = new Task(() =>
                    {                     
                           this.labelHDDDiskTime.Text = Convert.ToString(cimObj.ElementAt(0).CimInstanceProperties["PercentDiskTime"].Value) + "%";
                     }, this.ct);

                     if (t.Status != TaskStatus.Canceled && t.IsCompleted == false)
                     {
                          t.Start(ts);
                          t.Wait();
                      }
                  }
                  else
                  {
                        this.labelHDDDiskTime.Text = "---";
                  }
                }
                catch (Exception ex)
                {
                    Task taskException = new Task(() =>
                    {
                        
                        Debug.Print(ex.Message);
                    });

                    if (taskException.Status != TaskStatus.Canceled && taskException.IsCompleted == false)
                    {
                        taskException.Start(ts);
                        taskException.Wait();
                    }
                }

                Thread.Sleep(10000);
            }
        }
} 

Was muss in der ersten Klasse geändert werden, damit ich die Methode workerHDDStatus in der zweiten Klasse asynchron im Hintergrund laufen lassen kann. Ich habe natürlich mit dem Schlüsselwort async und await probiert aber irgendwie funktioniert das Ganze nicht so. Ich möchte nur aus einem Grund das Ganze auf async umstellen, weil zurzeit die Anwendung beim Aufbau der UserControls teilweise einfriert bzw. nicht alle UserControls auf dem Bildschirm darstellt.

Vielen Dank im Voraus für die Hilfe.

07.09.2016 - 17:45 Uhr

Ja, das ist eine Feststellung.

Mein Bastelprogramm läuft seit 4 Jahren und wird sehr gerne verwendet, um unter anderem die Terminalserver User zu verwalten. Wie gesagt das Programm läuft nur solange stabil bis ein Server ausfällt. Also, es ist nicht so dramatisch, wenn die Anwendung 3-Mal im Jahr für 2 Minuten einfriert. Vielleicht werde ich eines Tages dieses Problem lösen bzw. die Struktur des UserControls umstellen, wenn ich zeitlich dazukomme.

Vielen Danke für die freundlichen Antworten!

07.09.2016 - 16:07 Uhr

Damit nicht zu solchen Fehlermeldungen kommt, muss man die laufenden Tasks sofort beenden bzw. pausieren. Die laufenden Tasks können nicht weiter machen, wenn der Server auf einmal weg ist.

Danke für die Antworten. Sehr nett. 😃

07.09.2016 - 14:48 Uhr

Danke Palin,

ich werde es probieren.

07.09.2016 - 14:35 Uhr

Ich habe noch folgendes festgestellt:

Wenn ein Server nicht erreichbar ist, spuckt die Anwendungen folgende Meldungen aus und anschließend friert die Anwendung für 2 Minten ein:

Fehlermeldung:
Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.
Der Zugriff auf den Registrierungsschlüssel "238" wurde verweigert.
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.COMException" ist in mscorlib.dll aufgetreten.
Klasse nicht registriert (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

07.09.2016 - 12:24 Uhr

Ich habe gerade folgendes festgestellt:

Ich habe in der Methode workerHDD und in der workerPing eine Ausgabe eingebaut, damit ich sehen kann welche zuerst aufgerufen wird, wenn ein Server im Netz down ist:

Console.WriteLine("workerPing: " + this.isServerON);
Console.WriteLine("workerHDD: " + this.isServerON);

Ich habe den Testserver ausgeschaltet, damit ich die Reihenfolge der Ausgabe beobachten kann.

Ich lag die ganze Zeit falsch. Ich dachte, dass die Methode workerHDD nicht mitbekommt, wenn der Wert der Member Variable this.isServerON in der Methode workerPing geändert wird.

Die Reihenfolge der Ausgabe sieht nun so aus, wenn ein Server nicht erreichbar ist:

workerHDD: true

2 Minuten später:

workerPing: false

Also, für mich sieht so aus, dass die Tasks nicht in einer bestimmten Reihenfolge laufen. Das ist auch richtig so, weil sie Threads sind. Das heißt, ich muss einen Weg finde, damit ich die Methode workerPing zuerst aufrufen, falls ein Server nicht erreichbar ist!?!

07.09.2016 - 10:10 Uhr

Bis du da in der gleichen Instanz der Klasse wenn du den Wert prüfst?

Ja. Der Wert wird in einer anderen Worker-Methode gesetzt. Also die workerPing Methode. Diese Methode setzt den Wert auf true, wenn ein Server im Netz erreichbar ist.

07.09.2016 - 09:13 Uhr

Das Ganze ist ziemlich einfach:

Der Panel auf dem Form beinhaltet n Objekte vom UserControl. Ein UserControl beinhaltet n Worker-Methoden, die wiederum eine Endlosschleife mit einem Task + Sleep beinhalten.

Jede Worker-Methode holt sich Informationen von einem Windows-Server. Wie z.B. die Größe des C: Laufwerks. Ich wollte nicht ständig nach der Festplattengröße im Netz fragen. Aus diesem Grund habe ich eine Sleep-Methode eingebaut, damit ich alle 5 Minuten danach frage. Das reicht eigentlich vollkommen aus.

Ich habe eine workerPing Methode, die den Wert der Member Variable this.isServerON entsprechend ändert. Die anderen Worker-Methoden holen sich die Informationen von einem Server nur dann, wenn this.isServerON true ist. Mein Problem ist: workerPing Methode ändert den Wert von this.isServerON auf false, ABER die anderen Worker-Methoden bekommen das nicht mit!?! Das heißt: Die Methode workerHDD denkt, dass this.isServerON den Wert true hat, also der Server ist erreichbar! Die Methode workerHDD fällt auf die Nase, weil sie keine Infos holen kann und schmeißt aus diesem Grund jede Menge Exceptions.

07.09.2016 - 08:50 Uhr

Guten Morgen Taipi88,

zuerst vielen Dank für den Code Snipp.

>oder frierst du tatsächlich die Oberfläche für 3 Sekunden ein!?!
Ja, aber nur ein Teilbereich vom UserControl wird absichtlich eingefroren.

Mein Programm läuft seit 4 Jahren ohne Probleme, aber nur so lange, wenn alle Server im Netz erreichbar sind. Wenn ein Server nicht erreichbar ist, dann friert die ganze Anwendung für 60-120 Sekunden ein, dann läuft sie wieder normal. Das Problem liegt bestimmt an dieser Member Variable, die ich genannt habe.

Meine Anwendung besteht aus einer Oberfläche (Form) mit einem flowLayoutPanel. In diesem Panel erzeuge ich pro Server ein Objekt vom UserControl. Also, die Objekte vom UserControl sind voneinander unabhängig und sind in sich geschlossen. Ein UserControl hat eine Start-Methode, die nach der Instanziierung des UserControls im Panel aufgerufen wird:

public void start()
{
  Task.Factory.StartNew(workerPing);
  Task.Factory.StartNew(workerX);
  Task.Factory.StartNew(workerY);
  Und so weiter … 
}  

Diese worker-Methoden beinhalten alle die gleiche Struktur. Nur die Sleep-Zeiten sind unterschiedlich:

void workerX()
{
	for (; ;)
	{
		try
		{
			if (this.source.IsCancellationRequested)
			{
				return;
			}

			if (this.isServerON)
			{
				Task t = new Task(() =>
				{
					blabla
				}, this.ct);

				if (t.Status != TaskStatus.Canceled && t.IsCompleted == false)
				{
					t.Start(ts);
					t.Wait();
				}
			}
			else
			{
				blabla
			}
		}

		catch (Exception ex)
		{
			Task taskException = new Task(() =>
			{
				blabla
				Console.WriteLine(ex.Message);
			});

			if (taskException.Status != TaskStatus.Canceled && taskException.IsCompleted == false)
			{
				taskException.Start(ts);
				taskException.Wait();
			}
		}

		Thread.Sleep(9000);
	}
}

Kann ich meine Start-Methode durch Deine Run-Methode ersetzen? Was ist mit den unterschiedlichen Sleep-Zeiten? Kann ich die Sleep-Methode weiterhin in worker bzw. LoopingMethod weiterverwenden?

Vielen Dank.

06.09.2016 - 15:47 Uhr

Hallo Taipi88,

danke. Ich weiß nicht, wie ich es umsetzen soll, aber ich werde nachschauen.

Die Methode, die den Wert der Member Variable auf false setzt, sieht so aus:

            for (; ;)
            {
                try
                {
                    if (this.source.IsCancellationRequested)
                    {
                        return;
                    }

                    if (this.isServerAlive())
                    {
                        Task t = new Task(() =>
                        {
                            
                            this.isServerON = true;

                        }, this.ct);

                        if (t.Status != TaskStatus.Canceled && t.IsCompleted == false)
                        {
                            t.Start(ts);
                            t.Wait();
                        }
                    }
                    else
                    {
                        Task t = new Task(() =>
                        {

                            this.isServerON = false;

                        });

                        if (t.Status != TaskStatus.Canceled && t.IsCompleted == false)
                        {
                            t.Start(ts);
                            t.Wait();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Task taskException = new Task(() =>
                    {
                        this.isServerON = false;
                    });

                    if (taskException.Status != TaskStatus.Canceled && taskException.IsCompleted == false)
                    {
                        taskException.Start(ts);
                        taskException.Wait();
                    }
                }
                Thread.Sleep(3000);
            }
06.09.2016 - 14:57 Uhr

Hallo zusammen,

ich verwende mehrere

Task.Factory.StartNew(MethodeXYZ)

in einem UserControl.

Diese XYZ Methoden beinhalten folgendes:

MethodeX()
{
	if (this.isServerON)
	{
		Task t = new Task(() =>
		{
			mach was 
			
		}, this.ct);

		if (t.Status != TaskStatus.Canceled && t.IsCompleted == false)
		{
			t.Start(taskScheduler);
			t.Wait();
		}
	}
	else
	{
		mach was 
	}
}

Mein Problem:

Der Wert der Member Variable this.isServerON wird in einem anderen Thread bzw. Task durch false oder true geändert. Die Variable this.isServerON wird z.B. auf false gesetzt,
aber die Variable this.isServerON hat in der Methode MethodeX immer noch den Wert true. Ich gehe davon aus, dass dieser Task nicht den aktuellen Wert kennt, weil er schneller ist als der andere Task! Wie kann ich den aktuellen Wert ablesen?

Vielen Dank im Voraus.

13.08.2015 - 10:45 Uhr
// belegter Speicher
progressBar1.Value = (int)((1.0 - freeSpace / 449d) * 100d);

freeSpace ist 159GB.

(int)((1.0 - 159 / 449d) * 100d)

liefert mir 64. Wie soll ich diese Zahl interpretieren? Ist 64 der Prozentsatz?

Wenn ich die Festplattengröße unter Windows anschaue, dann steht dort:

Gesamtgröße (Speicherkapazität) der Festplatte: 449 GB
Freier Speicher: 159 GB
Belegter Speicher: 290 GB

Also, 64% von 449 GB ist zurzeit belegt oder?

Was ist mit:

progressBar1.Minimum =  
und 
progressBar1.Maximum = 

Muss ich diese Werte setzen?

Ich möchte, dass der progressBar zeigt: so und soviel Prozent% von 449 GB ist zurzeit belegt. Und bei 100% ist erreicht der progressBar das Maximum.

Danke.

11.08.2015 - 16:22 Uhr

Vielen Dank. Ich werde es testen und mich noch melden.

11.08.2015 - 15:45 Uhr

Hallo zusammen,

ich möchte gerne den Value vom ProgressBar nach einem bestimmten Intervall setzen. Also je nachdem, wie der freie Festplattenspeicher aussieht.
Der ProgressBar soll nur so viel anzeigen (noch verfügbare Kapazität), wie es auf der Festplatte belegt ist.

ObjectQuery query = new ObjectQuery("SELECT FreeSpace FROM Win32_LogicalDisk where DeviceID = 'C:'");

foreach (ManagementObject m in queryCollection)
{
    freeSpace = Math.Round((Convert.ToDecimal(m["FreeSpace"]) / 1073741824), 2);
}

FreeSpace ist: 159 GB
Die Gesamtgröße der Festplatte ist: 449 GB

Wie kann ich nun das Ganze als Prozentsatz berechnen und den Value vom ProgressBar entsprechend setzen?

progressBar1.Value = ?

Der Value soll NUR den belegten Speicher (als Prozent) von 449 GB anzeigen.

Vielen Dank im Voraus.

23.01.2013 - 10:42 Uhr

Ich möchte mit Sicherheit nicht, dass jemand die Methode für mich schreibt! Soweit kommt's noch. 😃

Ich habe eine Idee. Wie ich es schon erwähnt habe, habe ich bereits die User-Liste. Ich werde zuerst "Select * from Win32_Process" ausführen und anschließend das:

       foreach(ManagementObject process in searcher.Get())
       {
           args = new string[2];
           process.InvokeMethod("GetOwner",args);           
           if (args[0] == "Ein Benutzer aus meiner Liste")
           {
              Console.WriteLine("  {0}", process["Name"]);
           }           
       }

Danke.

22.01.2013 - 16:35 Uhr

Ich kenne diese Seite bereits. Ich habe aber die Prozess ID nicht. Ich kann natürlich die Prozesse von einem Remote Rechner per Process[] remoteAll = Process.GetProcesses("IP-Adresse"); abfragen, aber ich möchte, dass die Prozessliste nur dann auf eine Form-Maske (Listview) erscheint, wenn der Admin den eingeloggten User in der Liste markiert bzw. auswählt.

Ich möchte die Prozessliste nur anhand der Usernamen ermitteln!

Wie kann man so eine Methode schreiben?

string [] getProccesByUserName(string username); ??

Danke.

22.01.2013 - 14:31 Uhr

Hallo zusammen,

ich habe eine Liste von User, die auf dem Windows Server eingeloggt sind. Ich möchte eine Methode schreiben, die zu jedem User, den ich als Parameter übergebe eine Prozessliste als String Array zurück liefert! Ich habe eine Möglichkeit (WMI, Win32_Process bzw. GetOwner) gefunden, den Username von einem Prozess herauszufinden. Das ist aber nicht das, was ich suche! Die Benutzerliste habe ich
bereits! Wie bekomme ich die Prozesse von einem eingeloggten Benutzer heraus?

So soll es aussehen:

string[] GetProcessesByUsername(string username);

Vielen Dank im Voraus 😃

13.12.2012 - 21:14 Uhr

Gibt es da eine andere alternative, die man einsetzen kann, um die CPU Auslastung im LAN sauber abfragen zu können? Vielleicht gibt es eine funktionsfähige DLL, die man unter C# einbinden kann oder etwas ähnliches! Es gibt auch viele kommerzielle Programme, die in der Lage sind Remote PCs (Server) zu überwachen, unter anderem auch die CPU Auslastung. Ich würde gerne wissen, was diese Firmen einsetzen, um die CPU Auslastung auszulesen!!