Implement multithreading and asynchronous processing

You have a lot of items that need to be processed. For each item, you need to perform a complex calculation. Which technique should you use?

You use async/await to process all items concurrently.
You create a Task for each item and then wait until all tasks are finished.
You add all items to a BlockingCollection and process them on a thread created by the Thread class.
You use Parallel.For to process all items concurrently.