Hee 
Ik ben atm bezig met een simpele chatserver class library om te gebruiken in toekomstige projecten. Ik ben echter tegen een probleem aangelopen bij het gebruiken van meerdere threads: Zodra ik het StatusChanged() event aanroep vanuit een andere thread, komt deze ook in een andere thread aan @ form1.cs, waardoor het niet mogelijk is om formcontrols direct te bewerken. Ik wil echter voorkomen dat ik this.Invoke() moet gaan gebruiken in Form1.cs (om het simpel en overzichtelijk te houden), maar in chatserver.dll kan ik geen this.Invoke() gebruiken, omdat het geen form is... Is er een andere manier om ervoor te zorgen dat events via de main thread worden 'verzonden' vanuit chatserver.dll?
Hieronder een versimpelde/verkorte versie van het geheel:
Ik hoop dat iemand hier me met dit probleem kan helpen, want ik zit er nu al redelijk lang mee te prutsen
Ik ben atm bezig met een simpele chatserver class library om te gebruiken in toekomstige projecten. Ik ben echter tegen een probleem aangelopen bij het gebruiken van meerdere threads: Zodra ik het StatusChanged() event aanroep vanuit een andere thread, komt deze ook in een andere thread aan @ form1.cs, waardoor het niet mogelijk is om formcontrols direct te bewerken. Ik wil echter voorkomen dat ik this.Invoke() moet gaan gebruiken in Form1.cs (om het simpel en overzichtelijk te houden), maar in chatserver.dll kan ik geen this.Invoke() gebruiken, omdat het geen form is... Is er een andere manier om ervoor te zorgen dat events via de main thread worden 'verzonden' vanuit chatserver.dll?
Hieronder een versimpelde/verkorte versie van het geheel:
C#: chatserver.dll
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
| public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e); public struct StatusChangedEventArgs { public String Status; public StatusChangedEventArgs(string _status) { this.Status = _status; } } public class ChatServer { public event StatusChangedEventHandler StatusChanged; public ChatServer() { } public void Start() { ThreadStart ts = delegate { StartServer(); }; Thread td = new Thread(ts); td.Start(); } private void StartServer() { StatusChanged(this, new StatusChangedEventArgs("Online")); } } |
C#: form1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public Form1() { ChatServer chat = new ChatServer(); chat.StatusChanged += new StatusChangedEventHandler(Form1_StatusChanged); chat.Start(); } public void Form1_StatusChanged(object sender, StatusChangedEventArgs e) { txtLog.AppendText("Status changed to " + e.Status); // txtLog is een RichTextBox // InvalidOperationException was unhandled // Het is niet toegestaan een bewerking uit te voeren via verschillende threads: er // werd vanaf een andere thread toegang gekregen tot het besturingselement logTxt // dan de thread waarop het element is aangemaakt. } |
Ik hoop dat iemand hier me met dit probleem kan helpen, want ik zit er nu al redelijk lang mee te prutsen

Ehhh wat?