Zurück   Entwickler-Forum > .NET > C#

Antwort
 
Themen-Optionen Ansicht

Parallel.For & Invoke
Alt 13.08.2009, 23:28   #1
sci
Neuer Benutzer
 
sci ist offline
Registriert seit: 08.06.2009
Beiträge: 4
sci befindet sich auf einem aufstrebenden Ast
Standard Parallel.For & Invoke

Hallo,

hier wurde mir schon einmal gut geholfen. Ich hoffe diesmal wieder. Danke.

Kurz erklärt:
Buttonclick leitet Event an Controller weiter, wo Parallel.For abgearbeitet wird. Pro Loop soll eine Statusinformation ans View ausgegeben werden. Leider hängt sich das Prog auf.

Was mache ich falsch? Ich benutze das Framework 3.5. Framework 4.0 bekomme ich nicht als Zielframework in VS 2008 zur Auswahl, trotz Installation, mal so am Rande erwähnt, sonst hätt ich es noch mit dem Scheduler versucht, wie es Bsp. bei MSDN zeigen.

Code:
static void Main()
        {
            View view = new View();
            Controller cr = new Controller(view);
            Application.EnableVisualStyles();
            Application.Run(view);
        }

public partial class View : Form
    {
        public View()
        {
            InitializeComponent();
        }
               
        public event EventHandler Calculate;

        internal void OnCalculate()
        {
            EventHandler tmp = Calculate;
            if (tmp != null)
                tmp(this, EventArgs.Empty);
        }

        delegate void GenericDelegate();
        
        public void UpdateLabelText(string text)
        {
            GenericDelegate dlg = delegate()
            {
                this.label1.Text = text;
            };
            
            label1.Invoke(dlg);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OnCalculate();
        }
    }

    public class Controller
    {
        private View view;

        public Controller(View view)
        {
            this.view = view;
            this.view.Calculate += new EventHandler(view_Calculate);
        }

        void view_Calculate(object sender, EventArgs e)
        {
            System.Threading.Parallel.For(0, 5, delegate(int i)
            {
                view.UpdateLabelText(i.ToString());
            });
        }
    }
Danke für Unterstützung.

MFG
sci
  Mit Zitat antworten

Anzeige

Alt 14.08.2009, 00:10   #2
gfoidl
Stammgast
 
gfoidl ist offline
Registriert seit: 11.12.2007
Ort: Waidring / Tirol
Beiträge: 2.770
gfoidl befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
hier wurde mir schon einmal gut geholfen. Ich hoffe diesmal wieder. Danke.
Wir danken auch.

Bevor ich auf das eigentliche Problem eingehe will ich ein paar grundlegende Sachen klarstellen:
Zitat:
Buttonclick leitet Event an Controller weiter
In WinForms lässt sich MVC so wie du es vorhast nicht umsetzen. Per Definition ist der Controller für die Verarbeitung der Benutzereingaben zuständig. Das sind in WinForm die Ereignishandler welche die UI-Events binden. Somit verschmilzt aus Code-Seite View und Controller zu einem. Den Ansatz den du verfolgst - der auch gut ist - nennt sich Model View Presenter (MVP). Benenne als deinen Controller in Presenter um und es passt.

Zitat:
delegate void GenericDelegate();
Der Name ist ungünstig gewählt. Der Delegat hat nichts mit Generic zu tun. Für generische Delegaten siehe Generische Delegaten (C#-Programmierhandbuch)
Ich finde es merkwürdig dass ich (täglich) mit Generics arbeite aber es mir nicht möglich ist in einem Satz zu definieren was Generics sind

Zitat:
Leider hängt sich das Prog auf.
Das ist ein Klassiker wenn Threads von unerfahrenen Benutzern verwendet werden (nicht böse gemeint - den Fehler hab ich auch mal gemacht).
Wie korrekt von Threads auf UI-Elemente zugegriffen wird zeigt Gewusst wie: Threadsicheres Aufrufen von Windows Forms-Steuerelementen
Ergänzende Information: Mit Application.Run() wird der UI-Thread gestartet. Alles was mit UI zu tun ist ausschließlich in diesem Thread. Bei nicht-UI-Threads könne die Felder/Eigenschaften threadübergreifend manipuliert werden. Nicht jedoch beim Zugriff eines Threads auf den UI-Thread.


mfG Gü

Persönliche Anmerkung die nicht auf dich persönlich abziehlt:
Genau das hab ich befürchtet: Mit .net 4.0 ist es für jeden möglich Parallelverarbeitung durchzuführen ohne dass die grundlegenden Kenntenisse von Threading existieren. Dieses und weitere solcher Probleme werden in Zukunft immer öfter auftreten das es sehr verlockend und als Hype gilt mit mehreren Threads zu arbeiten. Ich bin dennoch der Meinung dass dieses Werkzeug nur dann sinnvoll eingesetzt werden kann wenn die Grundlagen wie zB Threadsynchronisation verstanden werden - auch wenn das Werkzeug viel von den Mechanismen die im Hintergrund tätig sind wegabstrahiert. Ich habe zB noch keinen Artikel über das Task-Parallel-Library gesehen der darauf eingeht welche Problem sich parallelisieren und nicht parallelisieren lassen.
Es ist gut zu überlegen ob die zu verarbeitenden Daten unabhängig voneinander sind - nur dann ist eine Parallelisierung möglich.
__________________
"Programming today is a race between the programmers and software engineers to create better
and more idiot-proof programs, and the universe, creating bigger and better idiots. So far,
the universe is winning". - Rich Cook
  Mit Zitat antworten

Alt 21.08.2009, 13:40   #3
gfoidl
Stammgast
 
gfoidl ist offline
Registriert seit: 11.12.2007
Ort: Waidring / Tirol
Beiträge: 2.770
gfoidl befindet sich auf einem aufstrebenden Ast
Standard

Fortsetzung: http://entwickler-forum.de/showthread.php?t=57101


mfG Gü
__________________
"Programming today is a race between the programmers and software engineers to create better
and more idiot-proof programs, and the universe, creating bigger and better idiots. So far,
the universe is winning". - Rich Cook
  Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu



Alle Zeitangaben in WEZ +2. Es ist jetzt 08:10 Uhr.



© 1995–2009 Software & Support Verlag GmbH. Vervielfältigung nur mit Genehmigung des Verlags.