The ReadItemValue does, with simplification, the following steps:
1. If we have some last data for the item, and it is "fresh enough" (explained later), we give them out and are done. Otherwise:
2. Connects to the server if not connected.
3. Adds the item to OPC group if not yet there.
4. Issues and OPC "read" request and waits for the result.
5. Checks if the quality is Good. If so, returns the value to you.
6. Otherwise, it Subscribes to the item changes, with some initial rate (defaults to 10 seconds), observes the incoming data and returns if the value is now Good or the timeout period expires.
In Step 1, the default setting is to provide values that are no older than 1000 milliseconds. It is possible to change it - e.g. require the OPC Server to always provide data from its Cache, or (on the other side of the spectrum), require the OPC server to always provide data by actually reading from the underlying Device.
One explanation for the observed behavior is that the server gives you a cached Bad quality first (when reading), and as we then set up a subscription automatically, we eventually receive the update with Good quality, but much later (possibly due to the 10 seconds default rate). You can try to experiment with the DataSource settings, e.g. try Cache or Device, like this:
var client = new EasyDAClient();
DAVtq vtq = client.ReadItem("OPCLabs.KitServer.2", "Simulation.Random",
new DAReadParameters(DADataSource.Device));
Note that as opposed to the ReadItemValue mthod, the ReadItem method does *not* wait for Good quality - it always returns whatever data (the Value/Timestamp/Quality triple) the server returns. It might be interesting to see what you get if using this method.
Best regards