2009-07-22 12 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

6

ヘルパーメソッドを呼び出すように編集すると、クリーナーになります。

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

... 

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

これは動作しません。 Sync(param1)は30秒かかり、OnWorkCompleteを実行すると現在のparam1にparamxがあり、私は間違った結果になります:( – Sakthivel

+0

Linqを持っていない場合でも動作しません... –

6

BackgroundWorkerを見ると、ワーカーが完了すると呼び出されるRunWorkerCompletedイベントがあります。 BackgroundWorkers Click Here

それとも

詳細については

あなたはそれが終わった後、スレッドからの完全な機能の呼び出しを追加し、それを呼び出すことができます。

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

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

があなたのスレッド方法の終わりには、IAsyncResult、BeginInvokeメソッドとAsyncCallback

1

、代表団を見てくださいほとんどのWinFormsメソッドが呼び出される必要があるので、あなたは(呼び出し()メソッドを使用して閉じる()を呼び出すことができます)UIスレッドから:上記の方法は、パラメータと複数のスレッドがある場合

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