Warum nicht die Kontrolle update/refresh-Mitte-Prozess

Ich habe eine windows-form (C#.NET) mit einem statusLabel, dass ich kann nicht scheinen, um zu aktualisieren, in der Mitte eines Prozesses, in event-handler-Methoden. Mein code sieht wie folgt aus...

    void Process_Completed(object sender, EventArgs e)
    {

        string t = "Process is finished!";
        this.Invoke(new StatusLabelUpdator(updateStatusLabel), new object[] { t });
    }

    void Process_Started(object sender, EventArgs e)
    {
        string t = "Process has begun";
        this.Invoke(new StatusLabelUpdator(updateStatusLabel), new object[] { t });
    }

    private delegate void StatusLabelUpdator(string text);
    private void updateStatusLabel(string text)
    {
        StatusLabel1.Text = text;
        statusStrip1.Invalidate();
        statusStrip1.Refresh();
        statusStrip1.Update();
    }

Wenn ich den code ausführen, sobald der Prozess beginnt, die Process_Started-Methode ausgelöst, und ein paar Sekunden später die Process_Completed-Methode ausgelöst. Aus irgendeinem Grund kann ich nicht bekommen, das status-label, um überhaupt angezeigt "Prozess begonnen hat". Es wird nur immer angezeigt "Vorgang beendet!". Wie Sie sehen können, habe ich versucht, ungültig, Auffrischung und Aktualisierung der status-Streifen, enthält die status-label, aber kein Erfolg. Ich kann Sie nicht anrufen-update/aktualisieren/invalidate auf dem statuslabel selbst, weil diese Methoden nicht zur Verfügung stehen. Was mache ich falsch?

ZUSÄTZLICHE INFO:

Den "Prozess" wird gestartet, indem eine Schaltfläche, klicken Sie auf die form, die dem Aufruf einer Methode in eine separate Klasse, die wie folgt aussieht:

public void DoSomeProcess()
{
    TriggerProcessStarted();
    System.Threading.Thread.Sleep(2000);   //For testing..
    TriggerProcessComplete();
}

innen die TriggerProcessxxxx Methoden, die ich auslösen der Ereignisse, die mit diesem code...

var EventListeners = EH.GetInvocationList();    //EH is the appropriate EventHandler
if (EventListeners != null)
{
    for (int index = 0; index < EventListeners.Count(); index++)
    {
        var methodToInvoke = (EventHandler)EventListeners[index];
        methodToInvoke.BeginInvoke(this, EventArgs.Empty, EndAsyncEvent, new object[] { });
    }
}

Endlich, ich habe Application.DoEvents() zu den updateStatusLabel Methode, aber es hat nicht geholfen. Ich bin noch immer das gleiche Ergebnis. Hier ist mein update-Methode.

private void updateStatusLabel(string text)
{
    StatusLabel1.Text = text;
    statusStrip1.Refresh();
    Application.DoEvents(); 
}

Also ich denke, die "Verarbeitung" statt auf den UI-thread aber-Event-Handler aufgerufen wird, auf seinen eigenen thread, dann startet das control-update wieder auf den UI-thread. Ist dies eine dumme Art und Weise, Dinge zu tun? Hinweis: Die Klasse enthält die DoSomeProcess () - Methode in eine separate .NET ClassLibrary, die ich bin Referenzierung.

InformationsquelleAutor PICyourBrain | 2010-02-26

Schreibe einen Kommentar