The solution as presented is actually not feasible because the System.DataTable.Read() is not thread safe. What this means is that any attempt to read from the same reader may produce redundant, out of order results.
DataTable thread safety
If the DataTable was thread safe, to achieve proper ordering (as mentioned already) you would still have to use synchronization techniques to surround both the read and the write. That is the only way to ensure that subsequent writes were from the appropriate read.
The real world problem to this example is reading in data from a large source, then outputting it. In the case the read operation is expensive the optimal threaded solution is to use asynchronous reads to store in a temporary concurrent collection (i.e. ConcurrentBag<t>). After all data retrieval is complete, you sort the list then output synchronously. That method requires the data contain the information required to sort. If a sorted order wasn't required you could use the producer-consumer pattern to improve output performance.