マルチスレッドの重要なポイントは、スレッドを他のスレッドとは独立して実行できるようにすることです。あなたがしたいことは、コールバックを使ってスレッドの完了を知らせることです。その後、UIがその完了に応答するようにします。
BackgroundWorker
クラスには、この目的ですでにイベントが組み込まれています。
あなたが購読したい3つのイベントがあります。あなたの仕事はどうなる場所
bw.DoWork +=
new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged +=
new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
DoWork
です。 ProgressChanged
では、進行状況のUIを更新できます。 は、DoWork
機能が完了したときにイベントをポップします。
このオブジェクトはスレッドを処理し、bw.RunWorkerAsync()
呼び出しを実行することによって非同期に実行するように設定できます。
このため、詳細については、以下のページを参照してください。例として
http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(String.Format("UI thread: {0}", Thread.CurrentThread.ManagedThreadId));
this.Invoke(new MethodInvoker(delegate() { MessageBox.Show(String.Format("Invoke thread: {0}", Thread.CurrentThread.ManagedThreadId)); }));
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
MessageBox.Show(String.Format("Worker thread: {0}", Thread.CurrentThread.ManagedThreadId));
}
}
この例では、フォームにボタン一つ一つのバックグラウンドワーカーを追加することによって構築することができます。 button1_ClickおよびbackgroundWorker1_DoWork関数のイベントデザイナーを介してイベントを配線します。 button1をクリックした後にポップアップする3つのMessagesBoxが必要です。UIスレッドとInvokeスレッドのIdが同じであることに気付くでしょう。つまり、呼び出しから何らかの処理を行うと、UIスレッドが待機することになります。 3番目のポップアップは、別のIDを持つワーカースレッドからのものです。
アプリがWPFベースの場合、[this](http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)に関連する必要があります。 – sovanesyan
あなたの 'mre.Set();'はスレッドの最後です。つまり、 'mre.WaitOne();'は 'tr.Join();'と同じです。つまり、全体が本質的にシングルスレッドです。 –