I want to bring to your attention the translation of the article
Concurrency vs Multi-threading vs Asynchronous Programming: Explained .
In recent times, I spoke at events and answered the audience’s question between my speeches about Asynchronous Programming, I discovered that some people confused multi-threaded and asynchronous programming, and some said it was the same thing. So, I decided to clarify these terms and add another concept of parallelism. There are two concepts here and both are completely different, the first is synchronous and asynchronous programming, and the second is single-threaded and multi-threaded applications. Each software model (synchronous or asynchronous) can operate in a single-threaded and multi-threaded environment. Let's discuss them in detail.
A synchronous program model is a program model where a single task is assigned to a thread and execution begins. When the task is completed, then there is an opportunity to do another task. In this model, it is impossible to stop the execution of a task in order to perform another task in the interval. Let's discuss how this model works in a single and multi-threaded scenario.
Single -
threadedness - if we have several tasks to be performed, and the current system provides one stream that can work with all tasks, then it takes turns one by one and the process looks like this:
')

Here we see that we have a thread (Stream 1) and 4 tasks that must be completed. The thread starts to execute alternately one by one and executes them all. (The order in which tasks are performed does not affect the overall implementation, we may have another algorithm that can determine the priorities of the tasks.
Multithreading - in this scenario, we used a lot of threads that can take tasks and get to work with them. We have thread pools (new threads are also created based on the need and availability of resources) and many tasks. So the stream can work like this:

Here we can see that we have 4 threads and as many tasks to perform, and each thread starts working with them. This is an ideal scenario, but under normal conditions we use a larger number of tasks than the number of available threads, so the freed thread receives another task. As already mentioned, the creation of a new thread does not occur every time because it requires system resources such as a processor, memory, and the initial number of threads must be determined.
Now let's talk about the Asynchronous Model and how it behaves in a single and multi-threaded environment.
Asynchronous programming model - unlike the synchronous software model, here a thread once starting a task can pause execution while keeping the current state and meanwhile starting another task.

Here we can see that one thread is responsible for performing all tasks and tasks alternate one after another.
If our system is able to have many threads then all threads can work in an asynchronous model as shown below:

Here we can see that the same task, say T4, T5, T6 ... is handled by several threads. This is the beauty of this script. As we can see, task T4 has started execution by first Thread 1 and completed by Thread 2. Similarly, task T6 is performed by Thread 2, Thread 3 and Thread 4. This demonstrates maximum use of threads.
So, so far we have discussed 4 scenarios:
- Synchronous single-threaded
- Synchronous multithreaded
- Asynchronous single-threaded
- Asynchronous multithreaded
Let's discuss another term - concurrency.
ParallelismSimply put parallelism is a way to handle multiple requests simultaneously. As we discussed two scenarios when multiple requests were processed, multi-threaded programming and an asynchronous model (single and multi-threaded). In the case of an asynchronous model, whether it is single-threaded or multi-threaded, while many tasks are being performed, some of them are suspended and some are executed. There are many features, but this is beyond the scope of this publication.
As previously discussed, the new era of asynchronous programming. Why is this so important?
Benefits of Asynchronous Programming
There are two things that are very important for each application - usability and performance. Ease of use because the user clicks a button to save some data, which in turn requires performing many tasks such as reading and filling data in an internal object, establishing a connection with SQL and storing it there. In turn, SQL runs on another machine on the network and runs under a different process; this can take a lot of time. Thus, if the request is processed by a single process, the screen will be in a hung state until the process is completed. That is why today many applications and frameworks rely entirely on the asynchronous model.
Application and system performance is also very important. It was noticed while the request is being executed, about 70-80% of them are waiting for dependent tasks. Thus, it can be maximally used in asynchronous programming, where, as soon as a task is transferred to another thread (for example, SQL), the current thread saves the state and is available to run another process, and when the sql task completes, any thread that is free can do this task.
Asynchrony in ASP.NETAsynchrony in ASP.NET can be a great incentive to improve the performance of your application. Here is how IIS handles the request:

When a request is received by IIS, it takes a stream from the CLR thread pool (IIS does not have any thread pool, but instead uses the CLR thread pool instead) and assigns it to it, which then processes the request. Since the number of threads is limited, and new ones can be created with a certain limit, then if the thread is in the waiting state most of the time, it will hit your server a lot, you can assume that this is a reality. But if you write asynchronous code (which now becomes very simple and can be written almost like synchronous using new keywords async / await), then it will work much faster and your server’s bandwidth will increase significantly, because instead of waiting for some sometime completion, it will be available to the thread pool for a new request. If an application has many dependencies and a long process of execution, then asynchronous programming will be no less good for this application.
So now we understand the difference of multi-threaded, asynchronous programming and the benefits that we can get using an asynchronous programming model.