2010-12-22 5 views
2

Ich mag den Dispatcher im Namespace System.Windows.Threading und möchte dieses Objekt in einer Klassenbibliothek verwenden. Da es jedoch für WPF erstellt wurde und anscheinend spezifisch für die Benutzeroberfläche ist, habe ich das Gefühl, dass ich seinen beabsichtigten Zweck missbrauche, indem ich es in einer Klassenbibliothek verwende.Erstellen einer Arbeitswarteschlange für einen Thread

Ich frage mich, ob es eine andere Klasse gibt, die den gleichen Zweck erfüllt (Erstellen einer Warteschlange von Arbeitselementen für einen Thread) aber besser für die Verwendung in einer Klassenbibliothek vorgesehen ist. Im Wesentlichen möchte ich nur einen Thread erstellen und aus einem anderen Thread asynchron eine Gruppe von Delegaten in die Warteschlange stellen, damit sie ausgeführt werden kann.

Ich könnte etwas ziemlich leicht bauen, aber ich würde lieber Standardkonventionen folgen und etwas verwenden, das bereits bewiesen ist. Danke im Voraus.

Antwort

1

BlockingCollection ist genau das, was Sie dann brauchen. Die Take-Methode blockiert solange, bis ein Element in der Warteschlange angezeigt wird. Dies macht es ideal für diese Art von Produzenten-Konsumenten-ähnlichen Szenarien.

public class Worker 
{ 
    private BlockingCollection<Action> m_Queue = new BlockingCollection<Action>(); 

    public Worker() 
    { 
    var thread = new Thread(
    () => 
     { 
     while (true) 
     { 
      Action action = m_Queue.Take(); 
      action(); 
     } 
     }); 
    thread.IsBackground = true; 
    thread.Start(); 
    } 

    public void QueueWorkItem(Action action) 
    { 
    m_Queue.Add(action); 
    } 
} 
+0

Ich liebe die Einfachheit dieser Lösung. Ich muss keine andere API lernen, und sie löst meine unmittelbare Notwendigkeit. Ich denke jedoch, dass die Aufgabenfunktionen der TPL in Tim Barrass 'Lösung etwas sein werden, was ich irgendwann lernen muss. – Verax

1

Die TPL verfügt über Taskplaner, mit denen Sie Arbeitswarteschlangen erstellen können. Schauen Sie sich this msdn link an. Der Standardwert ist die globale Threadpool zu verwenden, die Sie sollten Aufgaben mit nur hinzufügen können:

Task myTask = Task.Factory.StartNew(() => 
{     
    Console.WriteLine("Hello, I'm a queued task."); 
}); 

Wenn Sie anspruchsvollere Warteschlangenverwaltung, dann können Sie Ihre eigene Taskscheduler implementieren - es gibt viele Beispiele über die msdn Link oben.

Verwandte Themen