I think I need to see a sample of your code to understand what you ask. General, registering inputs and outputs should be done from the methods that are meant for that:
This will ensure that the methods get called only when Grasshopper needs them. When you copy the compilable code, the boilerplate generator creates these methods for you, using similar inputs as the ‘Hints’ options you chose for the scripting components. Because of the intricacies of the Grasshopper SDK, a Hint is not a Param by itself, so there is a translation.
You can also change the network topology or the solution properties (tree, list, ecc) from other methods. This may or may not have unintended consequences. Especially bad is if you change them while the solution runs. If you do this, you might be getting two results: if you do that from the SolveInstance method, you might stack overflow, as solving will call your method that will call solve that will call your method…
The other option, if you change these from another thread, is that you may not see any results or the solver may crash. So, in few words: do not change the network topology, solution properties (locked, etc) or options (list, tree access, longest list, etc) while the solution runs.