writeBlocking in a Vision Client

This. You should use binding (direct or indirect) whenever possible.

In almost all cases tag write functions can, and IMHO should, be replaced by a custom property with a bi-directional binding.

For instance:

system.tag.write*(['[default]path/to/value1'],[100])

Could also be something like:

event.source.customPropertyValue1 = 100

Where customPropertyValue1 is bound to [default]path/to/value1

In the event that you need to write a value to a tag in script and time is not critical then usesystem.tag.writeAsync()

If you need to insure that the values are written prior to continuing with another action, then system.tag.writeBlocking() is needed. In this case you can utilize system.util.invokeAysnchronous() to run on a background thread. If you need to effect changes to UI components, then you can utilize system.tag.invokeLater() to accomplish that.

Here is a discussion on a similar topic, it relates to V7.9 but the concepts still apply. writeSyncronous() and writeAllSyncronous() have been replaced with wrtieBlocking() in V8.