Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: So 05.05.13 23:31 
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.

ausblenden volle Höhe C#-Quelltext
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)// hier wird abgeprüft, ob es evtl. der erste Start ist, denn da sind ja noch keine Objekte in der pendingList
                {
                    _pendingList.RemoveAt(0);// hier soll also das 1. Objekt entfernt werden, weil es ja das sein müsste was gerade gestartet wurde

                    if (_pendingList.Count != 0)// Timer brauch nur (re)initialisiert werden, wenn noch elementen vorhanden sind
                        InitTimer();
                }
            }

            System.Threading.ThreadPool.QueueUserWorkItem(delegate
            {
                // Real work here
                // ...

                AddToPendingList(objekt);// Neustarten nach Zeit x
            });
        }

        private void AddToPendingList(Objekt objekt)
        {
            DateTime dateTime = GetRandomDateTime();// Methodenname sagt alles              
            var kvp = new KeyValuePair<DateTime, Objekt>(dateTime, objekt);

            lock (_pendingList)
            {
                int index = _pendingList.IndexOf(_pendingList.FirstOrDefault(x => x.Key > dateTime));//1. Element wo sein DateTime > dateTime ist
                if (index == -1)// kein Element größer
                {
                    _pendingList.Insert(0, kvp);
                    InitTimer();
                }
                else// ansonsten nur einfügen, da sich timer nicht ändert, nur das element irgendwo in der mitte hinzugefügt wird
                    _pendingList.Insert(index, kvp);
        }

        private void InitTimer()
        {
                double timeout = (_pendingList[0].Key - DateTime.Now).TotalMilliseconds;// timeout für den Timer errechnen bis zum Start

            lock (_timer)// kann man hier locken, wenn man später _timer = new Timer() aufruft?
            {
                if (timeout <= 0)//könnte überschneidung zw. laufzeit und datetime geben, daher wird hier abgeprüft
                    Start(_pendingList[0].Value);// direkt gestartet ohne timer
                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