2017-06-26 6 views
2

Ich habe eine Arbeiterklasse, deren Aufgabe es ist, startwhloop zu starten. Ich habe eine Liste von Arbeiterklassen, die jeweils auf ihrem eigenen Thread laufen. Alle n Sekunden sollte ich die Anzahl der Schleifen für jeden Arbeiter ausdrucken können. Meine Absicht ist es, Informationen über die einzelnen Arbeiter nach n Sekunden drucken (e.g.20 sec)
worker1 - noOfLoops - 10
worker2 - noOfLoops - 20
workern - noOfLoops - 30
Wie kann ich das erreichen. Code-SchnipselObjektstatus alle n Sekunden aktualisieren

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<IWorkerClass> workerClasses = new List<IWorkerClass>(); 
     for (int i = 0;i<5; i++) 
     { 
      workerClasses.Add(new WorkerClass("worker" + i.ToString())); 
     } 

     foreach(IWorkerClass wc in workerClasses) 
      { 
       IWorkerClass temp = wc; 
       Thread workerThread = new Thread(() => wc.StartWhileLoop()); 
       workerThread.Start(); 
      } 
      Console.ReadKey(); 
     } 
    } 
    public interface IWorkerClass 
    { 
     int noOfLoops { get; set; } 
     void StartWhileLoop(); 
    } 

    public class WorkerClass : IWorkerClass 
    {  
     string _name = string.Empty; 
     public WorkerClass(string name) 
     { 
      this._name = name; 
     } 
     public int noOfLoops{get;set;} 

     public void StartWhileLoop() 
     { 
      while(true) 
      { 
       Thread.Sleep(3000); 
       noOfLoops += 1;      
      } 
     } 
    } 
} 
+4

Also was ist die Frage – BugFinder

+0

, wie kann ich diese acheive so dass nach n Sekunden i den Status für jeden Arbeitnehmer –

+1

klingt nicht drucken können, wie man alles noch dann versucht. Wie denkst du, dass du es tun solltest? – BugFinder

Antwort

2

Der Code unten Ihre bestehende Struktur hält und erstellt einen neuen Thread, die ThreadReader jedem Arbeiter seine Fortschritte alle 20 Sekunden zu fragen, ausführt.

using System; 
using System.Collections.Generic; 
using System.Threading; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<IWorkerClass> workerClasses = new List<IWorkerClass>(); 
     for (int i = 0; i < 5; i++) 
     { 
      workerClasses.Add(new WorkerClass("worker" + i.ToString())); 
     } 

     foreach (IWorkerClass wc in workerClasses) 
     { 
      IWorkerClass temp = wc; 
      Thread workerThread = new Thread(() => temp.StartWhileLoop()); 
      workerThread.Start(); 
     } 

     Thread checkerThread = new Thread(() => ThreadReader(workerClasses)); 
     checkerThread.Start(); 

     Console.ReadKey(); 
    } 

    static void ThreadReader(List<IWorkerClass> workers) 
    { 
     while (true) 
     { 
      foreach (var worker in workers) 
      { 
       Console.WriteLine($"{worker.name} - {worker.noOfLoops}"); 
      } 

      Thread.Sleep(20000); 
     } 
    } 
} 
public interface IWorkerClass 
{ 
    string name { get; set; } 
    int noOfLoops { get; set; } 
    void StartWhileLoop(); 
} 

public class WorkerClass : IWorkerClass 
{ 
    public string name { get; set; } 
    public WorkerClass(string name) 
    { 
     this.name = name; 
    } 
    public int noOfLoops { get; set; } 

    public void StartWhileLoop() 
    { 
     while (true) 
     { 
      Thread.Sleep(3000); 
      noOfLoops += 1; 

     } 
    } 
} 
+0

Sie könnten auch das Problem des Schreibens/Lesens von 'noOfLoops' beheben, das nicht threadsicher ist. Entweder durch verblockte Ops oder durch einen Mutex. – Matthias247

+0

Ja, 'Interlocked.Increment' usw. würde das lösen. – mjwills

+0

Hat das geholfen @delwasafewrew? – mjwills

Verwandte Themen