Hello Why I haven't access to my private control on form (e.g. ListBox) from a static method? How to update control in this case?
EDIT 1.
my code:
ThreadStart thrSt = new ThreadStart(GetConnected);
Thread thr = new Thread(thrSt);
thr.Start();
and
static void GetConnected()
{
//update my ListBox
}
So it must be void, without param and be static, right?
EDIT 2.
If someone need solution in WPF then should try this:
private void GetConnected()
{
myListBox.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(() =>
{
myListBox.Items.Add("something");
}
)
);
}
Static methods cannot access instance state (such as a non-static control). Either remove static
from the method declaration, or pass a reference to the control as argument to the method:
private static void SomeMethod(ListBox listBox)
{
listBox.Items.Add("Some element");
}
...and call it like so:
SomeMethod(MyListBox);
Update
There are different ways to do asynchronous things in the UI (now assuming winforms). I would recommend you to look into using BackgroundWorker
(search here on SO; plenty of examples). If you really want to do it by creating threads on your own, here is one way to do that:
private void SomeMethod()
{
string newElement = FetchNextElementToAdd():
SafeUpdate(() => yourListBox.Items.Add(newElement));
}
private void SafeUpdate(Action action)
{
if (this.InvokeRequired)
{
this.BeginInvoke(action);
}
else
{
action();
}
}
...and to call it:
Thread thread = new Thread(SomeMethod);
thread.Start();
You can also use the thread pool (preferred over creating your own threads, given that you don't expect them to run for very long):
ThreadPool.QueueUserWorkItem(state => SomeMethod());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With