Producer/consumer implementation using Tasks and BlockingCollections I'm implementing a Producer/Consumer but the generic interface doesn't require any knowledge of blocking collections or tasks.  

public interface IReader
{
    IEnumerable&lt;Data&gt; Read();
}


Is it okay if my implementation of the IReader launches a task asynchronously and returns the consuming enumerable?

public IEnumerable&lt;Data&gt; IReader.Read()
{
    var t = Task.Factory.StartNew(() =&gt;
    {
        BlockingCollection&lt;Data&gt; data = new BlockingCollection();
        DoRead(data);
        return data.GetConsumingEnumerable();
    });

    return t.Result;
}


My concerns are:


Performance.  Is there any negative effect from having the
BlockingCollection on a different thread than the consumer? 
Is it bad practice to not indicate that the method is executing asynchronously?
Did you know that Task.Result blocks? Your code isn't asynchronous at all - and it can't be unless DoRead is.

Effectively your code is starting a new task and then blocking while it completes - there's no benefit to starting the task at all! 

As a small aside, Task.Run is easier than using Task.Factory.StartNew.

If I were you, I'd just remove the Task.