I believe they differ due to the Widget interaction method on the App side; One is automatic and the other requires user/script intervention.
BLYNK_WRITE(vPIN) works when the Widget is told via manual activation (PUSH) to submit its state or value update, usually asa control command, to the server/MCU. This activates a
function() that can contain many commands and processes that can be determined by the incoming state/value. Regular display feedback is usually handled by timers or
fuction() reaction via
BLYNK_READ(vPIN) works when the Widget is asking via pre-determined polling for its state change or value update, usually a simple display update to same widget, via
Blynk.virtualWrite()… thus no need for device side timers in order to have regular feedback.
Most programmers use the WRITE method as it gives them a single point of timing and control for everything… their device’s scripting.
The documentation is admittedly written in geek, so not always clear to mere mortals… but it says much the same thing…
BLYNK_WRITE defines a function that is called when device receives an update of Virtual Pin value from the server:
BLYNK_READ defines a function that is called when device is requested to send it’s current value of Virtual Pin to the server. Normally, this function should contain some Blynk.virtualWrite calls.