Hallo,
ich hoffe, ich hab die Sache mit dem Invoke nun verstanden, daher mal eine Frage:
Ich habe eine Klasse, welche einen Timer beinhaltet. Dieser ruft eine Methode auf, die wiederum ein Event auslösen soll, das von der Hauptanwendung abgefangen wird, um eine ListBox zu befüllen.
Problem ist nun, dass ich dem Anwender der Klasse eigentlich nicht zumuten möchte, mit delegates und invoke zu arbeiten, sondern er soll direkt aus dem EventHandler heraus, GUI-Komponenten befüllen können. Aber irgendwie bekomme ich das nicht hin.
Folgendermaßen sieht mein Aufbau aus:
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:
| public class NewMailEventArgs : EventArgs { List<string> messageIds; public NewMailEventArgs(List<string> messageIds) { this.messageIds = messageIds; } public List<string> MessageIds { get { return messageIds; } set { messageIds = value; } } }
public class ExchangeCommunication { public delegate void NewMailEventHandler(object sender, NewMailEventArgs e); public event NewMailEventHandler OnNewMailHandler; protected void OnNewMail(object sender, NewMailEventArgs e) { if (OnNewMailHandler != null) OnNewMailHandler(sender,e); }
void PullEvents(object sender, ElapsedEventArgs e) { if (messageIds.Count>0) { NewMailEventArgs newMailEventArgs = new NewMailEventArgs(messageIds); object[] objs = new object[2]; objs[0] = this; objs[1] = newMailEventArgs; syncInvoke.Invoke(new NewMailEventHandler(OnNewMail), objs); } } } |
PullEvents wird von meinem Timer ausgelöst und löst dann den Event aus. Mit meinem Synchronizer funktioniert das so aber nicht, ich bekomme in der Hauptanwendung immer noch Fehler bezüglich threadübergreifender Zugriffe.
Wie kann ich dieses Problem umgehen/lösen?