[C#] Invoking Thread weergeven

Pagina: 1
Acties:

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hallo,

Ik ben wat met threading aan het spelen.

Nu heb ik zoals Whoami al een aantal keer gepost heeft een Task object aangemaakt die een actie uitvoert. Dmv een eventhandler schrijf ik een textje naar een textbox.

Ik het task object geef ik de thread een naam, en nu wil ik die weergeven alleen is de thread.name leeg als ik de CurrentThread op haal.

Form:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public event EventHandler _OnStatusChanged;

        private void btnStart_Click(object sender, EventArgs e)
        {
            _OnStatusChanged += new EventHandler(UpdateText);
            
            MyTask task1 = new MyTask();
            task1.StatusUpdated = _OnStatusChanged;

            MyTask task2 = new MyTask();
            task2.StatusUpdated = _OnStatusChanged;


            task1.Run("thread1");
            task2.Run("thread2");
        }

        public void UpdateText(object sender, EventArgs e)
        {
            Thread y = Thread.CurrentThread;
            txtBox.AppendText("Invoke from \r\n");
        }
    }


en de task
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class MyTask
    {
        private event EventHandler _statusUpdated;

        public EventHandler StatusUpdated
        {
            get
            {
                return _statusUpdated;
            }

            set
            {
                _statusUpdated = value;
            }
        }

        public void Run(string name)
        {
            Thread thread = new Thread(new ThreadStart(PerformTasks));
            thread.Name = name;
            thread.Start();
        }

        private void PerformTasks()
        {
            while (true)
            { 
                //Do something
                OnStatusUpdated();
                Thread.Sleep(1000);
            }
        }

        private void OnStatusUpdated()
        {
            System.Windows.Forms.Control c = _statusUpdated.Target as System.Windows.Forms.Control;

            if (c != null)
            {
                c.Invoke(_statusUpdated, new Object[] { this, EventArgs.Empty });

            }
            else
            {
                _statusUpdated(this, EventArgs.Empty);
            }
        }
    }


Ik wil dus in de UpdateText de aaroepende thread weergeven maar dat gaat dus niet.
Wat doe ik verkeerd?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Volgens mij kan je dat niet doen zoals jij nu wilt; imho zal Thread.CurrentThread op regel 27 van je eerste code-fragment altijd de UI thread zijn. In je OnStatusUpdated() method ga je er nl. voor zorgen dat je je UI op je UI thread updated.

Wat je kan doen, is dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MyTask
{
    private Thread _t;

    public string ThreadName
    {
          get
          {
                  return _t.Name;
          }
    }

    public void Run( string name )
    {
          _t = new Thread ( ... );
          _t.Name = name;
          _t.Run();
    }
    ...
}

code:
1
2
3
4
public void UpdateText(object sender, EventArgs e)
{
   textBox1.Text =  ((MyTask)sender).Name;
}

Je kan natuurlijk ook je eigen Event type maken, die een custom EventArgs class heeft, die de naam van je Thread bevat. Dan hoef je je sender niet te casten.

[ Voor 10% gewijzigd door whoami op 06-03-2007 10:41 ]

https://fgheysels.github.io/


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Zoiets had ik ook al bedacht, alleen wist ik niet of dat de correcte manier was.

Ik ga weer even verder experimenteren.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...