Hallo,
ich weiß, das Thema wurde schon sehr oft gestellt, aber in meiner Situation haben mir die vielen Suchergebnisse nicht wirklich geholfen, da, wie ich das sehe, meine Anforderungen etwas speziell sind.
Deshalb möchte ich nun hier fragen:
Ich habe einen Thread, der in einer State-Maschine verschiedene Aufgaben abarbeitet. Das ganze kann man sich in
einer großen While-Schleife vorstellen, welche unendlich lang abgearbeitet wird. Die abzuarbeitenden Aufgaben holt sich der Thread aus einer Warteschlange ab.
Nun können in dieser Warteschlange Objekte auftreten, bei welchen der andere Thread (jener, der die Objekte in die Warteschlange einreiht) benachrichtigt werden muss.
Wie kann ich diesen Thread abhängig vom Objekt elegant benachrichtigen? Bislang mache ich das so, dass ich in dem betreffenden Objekt ein Flag setze und im anderen Thread solang warte, bis das Thread gesetzt wurde.
Was meint ihr zu dieser Lösung? Ich finde sie nicht so elegant.
Code-Schnipsel, wo gewartet wird, bis das Flag gesetzt wurde
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:
| while (true) { var message = InboundQueue.Dequeue();
if (JobTable.Contains(info)) { var job = JobTable[info]; message.TryUse = true; message.RuleResult = Rules.RuleResult.Undefined; job.InboundQueue.Add(message);
while (message.RuleResult == Rules.RuleResult.Undefined) { Thread.Sleep(10); }
switch (message.RuleResult) { case Rules.RuleResult.TestPassed: continue; default: message.RuleResult = Rules.RuleResult.Undefined; break; }
} message.TryUse = false; } |
Code-Schnipsel, wo das Flag gesetzt wird:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ruleResult = Rules.Validate(Rules.RuleName.Rule1a, message, out response, job); message.RuleResult = ruleResult; switch (ruleResult) { case Rules.RuleResult.Failed: RemoveJob(job); return; case Rules.RuleResult.TestFailed: continue; } |
Moderiert von
Th69: Topic aus C# - Die Sprache verschoben am Do 03.05.2012 um 15:55