I’m having problems with passing loaded data from one thread to another to add the data to the form. I added another object into “var obj = new object[] { names }” and got “Parameter count mismatch”. I’d still prefer to pass “Clients” and “Messages” from “LoadData()” in the second thread to “UpdateFormMethod()” in the first one, but I have no idea how to do it. I’d be grateful if anyone could help me with this problem.
Here’s the important part of the code within one class:
private readonly Thread _thread;
public readonly Loader Loader = new Loader();
public Dictionary<string, Client> Clients;
public Dictionary<string, Message> Messages;
private bool _stopData = false;
public delegate void UpdateForm(object data);
public UpdateForm MyDelegate;
public Fcon() {
InitializeComponent();
MyDelegate = new UpdateForm(UpdateFormMethod);
_thread = new Thread(LoadData);
_thread.Start();
}
public void UpdateFormMethod(object data) {
foreach (var str in ((IEnumerable<string>)data).Where(str => !fcon_container_users_list.Items.Contains(str))) {
fcon_container_users_list.Items.Insert(0, str);
}
}
public void LoadData() {
while (!_stopData) {
Clients = Loader.GetClients(Operator);
Messages = Loader.GetMessages(Operator);
var status = Loader.SetStatus(Operator);
var names = new string[Clients.Count];
var x = 0;
foreach (var kvp in Clients) {
names[x] = "user_" + kvp.Value.id_fcon_client;
x++;
}
var obj = new object[] { names };
this.Invoke(this.MyDelegate, obj);
Thread.Sleep(1000);
}
}
public void StopData() {
_stopData = true;
}
It sounds like you’re not entirely clear where the signature is coming from. It’s your own delegate – if you want to change the signature, just change the signature of the delegate and the method implementing it:
Then:
Or more simply:
I’d probably use the existing
Action<T>,Action<T1, T2>delegates rather than creating new ones though OR T Func<T1 [,T2]> if you require a return type.