I think that all access to user interface controls should be done from the user interface thread. Modifying control from a thread that does not own a base descriptor can have undesirable consequences. In the best case, an exception will be thrown, in the worst case, everything may seem all right until some race condition occurs (and you can spend a lot of time playing it again).
Use the Invoke method, passing in the delegate that will be executed in the user interface thread.
source share