Threading Join
Håber en eller anden kan hjælpe mig med lidt threading:Når jeg kører nedennævnte ex i en Console aplikation (statiske metoder), så termineres trådene godt nok efter join.
using System;
using System.Threading;
class MainClass
{
public static void Main(string[] args)
{
Thread[] t = new Thread[10];
for(int i = 0; i < t.Length; i++) {
t[i] = new Thread(new ThreadStart(DoSomething));
}
for(int i = 0; i < t.Length; i++) {
t[i].Start();
}
for(int i = 0; i < t.Length; i++) {
t[i].Join();
}
}
public static void DoSomething()
{
Console.WriteLine("start");
Thread.Sleep(5000);
Console.WriteLine("end");
}
}
Hvis jeg kører det i en WinForm aplikation med en knap og en richtextbox(rtb) så hænger aplikation i Join.
ex 1:
namespace ThreadingWinForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread[] t = new Thread[10];
for (int i = 0; i < t.Length; i++)
{
t[i] = new Thread(new ThreadStart(DoSomething));
t[i].Name = "ID " + i.ToString();
}
for (int i = 0; i < t.Length; i++)
{
t[i].Start();
}
for (int i = 0; i < t.Length; i++)
{
t[i].Join();
}
}
delegate void UpdateRTBDelegate(string _text);
private void UpdateRTB(string _text)
{
if (this.rtb != null)
{
if (this.rtb.InvokeRequired)
{
this.rtb.Invoke(new UpdateRTBDelegate(UpdateRTB), _text);
}
else
{
this.rtb.AppendText(_text + "\n");
this.rtb.ScrollToCaret();
this.rtb.Refresh();
}
}
}
public void DoSomething()
{
UpdateRTB("start - " + Thread.CurrentThread.Name);
Thread.Sleep(5000);
UpdateRTB("end - " + Thread.CurrentThread.Name);
//UpdateRTB("Join - " + Thread.CurrentThread.Name);
//Thread.CurrentThread.Join();
}
}
}
ex 2:
Så prøvede jeg at flytte Join ned i DoSomething, men så hænger aplikationen når jeg lukker den.
private void button1_Click(object sender, EventArgs e)
{
Thread[] t = new Thread[10];
for (int i = 0; i < t.Length; i++)
{
t[i] = new Thread(new ThreadStart(DoSomething));
t[i].Name = "ID " + i.ToString();
}
for (int i = 0; i < t.Length; i++)
{
t[i].Start();
}
//for (int i = 0; i < t.Length; i++)
//{
// t[i].Join();
//}
}
public void DoSomething()
{
UpdateRTB("start - " + Thread.CurrentThread.Name);
Thread.Sleep(5000);
UpdateRTB("end - " + Thread.CurrentThread.Name);
UpdateRTB("Join - " + Thread.CurrentThread.Name);
Thread.CurrentThread.Join();
}
Hvad er det der gør at trådene ikke termineres? Jeg kan selvfølgelig bruge Abort() istedet, eller sætte et Timespan i Join. Men er det ikke Join man helst skal bruge?