Ich bekomms einfach nicht gebacken. Ich möchte in meiner Klasse gerne eine Liste halte, in der eine Liste existiert, die die Objekte hält, die nacheinander abgearbeitet werden sollen. Es muss deshalb eine Liste sein, weil neue Objekte nicht automatisch ans Ende angehängt, sondern an beliebiger Stelle hinzugefügt werden sollen.
Es soll also ein Objekt gestartet werden und nach einer zufälligen Zeit wieder gestartet werden. Es können ständig neue Objekte dazukommen, beim ersten Start sollen die direkt in den ThreadPool kommen, danach kommen sie in die pendingList und werden abgearbeitet sobald sie wieder dran sind.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| public class StartManager { private Timer _timer = new Timer(); private List<KeyValuePair<DateTime, Objekt>> _pendingList = new List<KeyValuePair<DateTime, Objekt>>();
public void Start(Objekt objekt) { lock (pendingList) { if (_pendingList.Count != 0) { _pendingList.RemoveAt(0); if (_pendingList.Count != 0) InitTimer(); } }
System.Threading.ThreadPool.QueueUserWorkItem(delegate { AddToPendingList(objekt); }); }
private void AddToPendingList(Objekt objekt) { DateTime dateTime = GetRandomDateTime(); var kvp = new KeyValuePair<DateTime, Objekt>(dateTime, objekt);
lock (_pendingList) { int index = _pendingList.IndexOf(_pendingList.FirstOrDefault(x => x.Key > dateTime)); if (index == -1) { _pendingList.Insert(0, kvp); InitTimer(); } else _pendingList.Insert(index, kvp); }
private void InitTimer() { double timeout = (_pendingList[0].Key - DateTime.Now).TotalMilliseconds; lock (_timer) { if (timeout <= 0) Start(_pendingList[0].Value); else { _timer = new Timer(timeout); _timer.AutoReset = false; _timer.Elapsed += delegate { Start(_pendingList[0].Value); }; _timer.Start(); } } } |
Ein einzelnes Objekt funktioniert, bei mehreren kommt irgendetwas durcheinander und ich weiß nicht so recht woran es liegt. Man kanns auch so schlecht debuggen. Bin für jede Hilfe dankbar, auch besseren Programmierstil. Auch wenn mans irgendwie anders lösen kann? Könnte mir eigentlich auch vorstellen, dass es das so schon irgendwo gibt.
LG BlackMatrix