Autor Beitrag
kingdave2nd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 13.06.08 14:59 
Hallo zusammen,

ich hoffe nicht, das ich mich hier gleich total mit meinem ersten Thread blamiere, aber ich komme grade einfach nicht mehr weiter (was durchaus daran liegen kann, dass ich noch allzulange mit C# werkel).

Ich möchte gerne eine Form (die einfach nur eine endlos laufende Progrssbar enthält) starten und nach irgendwelchen Aktionen wieder beenden (während im Hintergrund halt Prozesse laufen). Nun habe ich mir gedacht, ich packe in meine Main Klasse den folgenden Schnipsel:

ausblenden 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:
using System.Threading;
...
public class Main
{
        Thread statusWindow;
        ...

        public Thread StatusWindow
        {
            get { return statusWindow; }
            set { statusWindow = value; }
        }
        ...

        public Main()
        {
            statusWindow = new Thread(this.ShowStatusWindow);
            statusWindow.IsBackground = true;
        }
        ...

        public void ShowStatusWindow(object Message)
        {
            FormShowStatus status = new FormShowStatus(Message.ToString());
            status.ShowDialog();
        }
        ...



Anschliessend rufe ich wo immer ich es brauche mein Status Window mit

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
    Main.StatusWindow.Start("Der text der im Fenster erscheinen soll");
        ...
        ...
        ...
    Main.StatusWindow.Abort();


auf. Soweit klappt das auch beim allerersten Aufruf. Leider nur beim ersten Aufruf. Bei jedem weiter Aufruf auf die gleiche Art und Weise erhalte ich die Exception "Thread is running or terminated, it cannot restart". Der Threadstate ist beim ersten mal tatächlich auf "Background | Unstarted" gesetzt, nach dem "Abort()" auf "stopped.

Soweit so gut, ich sehe ja acuh, das ein "Abort" den stoppt. Aber wie gehe ich jetzt richtig mit dem Thread um. Die Methode "Suspend" ergibt das gleiche Ergebnis, abgesehen dasvon sagt mir der Compiler gleich, das Dingens ist veraltet.
Vielleicht suche ich auch flasch, aber finde nicht wirklich einen Hinwes (den ich verstehe) darauf, wie ich nun korrekt diese Thread beliebig oft neustarten kann.

Würde mich sehr über Hilfe freuen

Viele grüsse

Dave

Moderiert von user profile iconChristian S.: Quote- durch C#-Tags ersetzt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 13.06.08 18:01 
Du hast alles richtig gemacht: Es ist einfach nicht möglich.
Zitat:
Once the thread terminates, it cannot be restarted with another call to Start.

Du musst also jedes Mal eine neue Thread-Instanz erstellen.
Allerdings ist Abort ja nicht gerade die feine Art ;) . Normalerweise wird der Backgroundthread von der GUI aus gestartet, das könnte dann etwa so aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
// Form-Konstruktor
ThreadPool.QueueUserWorkItem(delegate {
  ...// machwas

  // Synchronisierung mit dem Form-Thread
  Invoke(new MethodInvoker(ThreadFinished)); // MethodInvoker gleichbedeutend mit System.Action (ab 3.5)
});

...

void ThreadFinished()
{
  Close();
}
kingdave2nd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 19.06.08 15:55 
Hi,

Vielen Dank für die schnelle Antwort. Sorry wenns ein bisschen gedauert hat, aber mein Chef will doch tatsächlich, das ich neben der Programmierei noch meinem Hauptjob nachgehe ;-).

Was ich jetzt glaube verstanden zu haben:
Du meinst, ich muss nicht das Status Window in einen eigenen Thread legen, sondern den Connection Aufbau zu meinem Webservice (oder was auch sonst immer Zeit in Anspruch nimmt)?

Gruss Dave