I understand deferred execution in LINQ as explained here: What are the benefits of a Deferred Execution in LINQ?
However, deferred execution can lead to bugs especially in multithreaded scenarios eg. evaluation performed on a shared collection outside of a lock. When a method that returns a deferred evaluation is nested several method layers deep, it can get really hard (at least for me) to remember or keep track of such that I lock appropriately.
Omitting special cases like infinite sequences (eg. Fibonacci) and also assuming the filtering of the collection is deemed complete (ie. it is not likely that the consumer would filter the results further), what would be considered the "best approach" when returning a collection of IEnumerable from a method -- should it already be evaluated or deferred?
Note: "best approach" can be defined in terms of efficiency/code safety of some other measure, just verify in your response. I would like to know how the community does this.
Follow-on question: does it make sense to explicitly state in the method name if the result is evaluated or deferred?