2009-07-22 14 views
5

Mam formularz, który rozpoczyna wątek. Teraz chcę, aby formularz automatycznie zamykał się, gdy wątek zakończy się.Wywołanie metody, gdy wątek kończy się

Jedynym rozwiązaniem, jakie znalazłem do tej pory, jest dodanie licznika do formularza i sprawdzenie, czy wątek jest aktywny przy każdym tiku. Ale chcę wiedzieć, czy jest lepszy sposób na zrobienie tego?

Obecnie mój kod wygląda mniej więcej jak to

partial class SyncForm : Form { 
    Thread tr; 

    public SyncForm() 
    { 
     InitializeComponent(); 
    } 

    void SyncForm_Load(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(Synchronize)); 
     thread.IsBackground = true; 
     thread.Start(); 
     threadTimer.Start(); 
    } 

    void threadTimer_Tick(object sender, EventArgs e) 
    { 
     if (!thread.IsAlive) 
     { 
      Close(); 
     } 
    } 

    void Synchronize() 
    { 
     // code here 
    } 
} 

Odpowiedz

10

Klasa BackgroundWorker istnieje dla tego rodzaju zarządzania wątku zapisać konieczności toczyć własną rękę; oferuje wydarzenie RunWorkerCompleted, którego można po prostu posłuchać.

+0

Działa wspaniale, dzięki – RaYell

6

Edytuj, aby wywołać metodę pomocnika, aby była czystsza.

thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); 

... 

private void OnWorkComplete() 
{ 
    Close(); 
} 
+0

To nie działa, jeśli powyższe metody mają parametry i wiele wątków. Sync (param1) zajmuje 30 sekund, a po uruchomieniu OnWorkComplete mam paramks na bieżącym parametrze param1 i otrzymuję błędne wyniki :( – Sakthivel

+0

Również nie działa, jeśli nie masz Linq ... –

6

Jeśli spojrzeć na BackgroundWorker, jest wydarzeniem RunWorkerCompleted która jest wywoływana, gdy pracownik kończy.

Aby uzyskać więcej informacji na temat BackgroundWorkers Click Here

Albo

Można dodać wywołanie do pełnej funkcji z wątku po jego zakończeniu i wywołać je.

void Synchronize() 
{ 
    //DoWork(); 
    //FinishedWork(); 
} 

void FinishedWork() 
{ 
if (InvokeRequired == true) 
    { 
    //Invoke 
    } 
else 
    { 
    //Close 
    } 
} 
1

Wystarczy popatrzeć na delegatów, IAsyncResult, BeginInvoke i AsyncCallback

1

Pod koniec swojej metodzie wątku, można wywołać Close() za pomocą metody Invoke() (ponieważ metody większość WinForms powinien być nazywany z wątku UI):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
} 
Powiązane problemy