2009-07-22 66 views
5

我有一個表單啓動一個線程。現在我希望表單在該線程終止時自動關閉。線程終止時調用方法

我到目前爲止唯一找到的解決方案是在窗體中添加一個計時器,並檢查線程是否在每個打勾處都處於活動狀態。但我想知道是否有更好的方法來做到這一點?

目前我的代碼看起來更不像這個

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 
    } 
} 

回答

10

BackgroundWorker的類存在這種線程管理,以節省您不必推出自己的;它提供了一個RunWorkerCompleted事件,您可以只聽。

+0

很好,謝謝 – RaYell 2009-07-22 09:46:59

6

編輯使其調用助手方法,使其更清潔。

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

... 

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

如果上述方法有參數和多線程,這是行不通的。同步(param1)需要30秒,並且當它執行OnWorkComplete時,我在當前param1上有paramx,並且我得到錯誤結果:( – Sakthivel 2014-02-13 15:05:21

6

如果你看看BackgroundWorker,那麼在Worker完成時會調用RunWorkerCompleted事件。

有關BackgroundWorkers Click Here

或者

你可以一旦完成調用一個功能齊全從Thread添加,並調用它的詳細信息。

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

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

看一看代表,IAsyncResult的,的BeginInvoke和AsyncCallback的

1

在你的線程方法結束時,您可以使用invoke()方法(調用close(),因爲大多數的WinForms方法應該被稱爲從UI線程):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
}