About covariance and contravariance, please see:
http://msdn.microsoft.com/en-us/library/ms173174%28v=vs.100%29.aspx[
^].
Are those examples real-life enough for you? If not, think by yourself. Basically, asking such questions, you are taking counter-productive position (which is not a problem, just think about it), as if the authors of the techniques needed to justify their inventions by applications in "agriculture and industry". It would be more productive if you started with understanding what those features do, and though how they could improve your own work.
The second question is worse. Don't you understand it: the questions "what is the difference between {0} and {1}" cannot be valid. If you don't get it, please tell us the difference between apple and Apple. :-)
First of all, you need to understand that the essence of the words in not in their names. You should try to understand how concurrency works and why you need it. And, separately, try to understand what is considered as synchronous in computing and what is asynchronous. And understand how it all works in difference cases. Discussion of all that in our
Quick Questions & Answers forums looks pretty much pointless. This is some education you need, and education has very little to do with names and definitions, it's really a lot more of understanding. If you face some particular problem in understanding of these concepts
in the context where they work, you are welcome to ask questions.
Perhaps you need to see this discussion:
How to ask a good question?[
^].
Don't forget about following these reasonable rules:
Code Project Questions and Answers FAQ[
^]
How to Use Google and Other Tips for Finding Programming Help[
^]
Some guidelines for posting questions in the forums[
^])
Good luck,
—SA