Alcune primitive di sincronizzazione che le forniture .Net sono wrapper gestiti attorno agli oggetti nativi sottostanti.
Attualmente, non esistono primitive di sincronizzazione nativa che implementano il blocco asincrono. Quindi gli implementatori .Net devono implementarlo da zero, il che non è così semplice come sembra.
Inoltre, il kernel di Windows non fornisce alcuna funzionalità di "locking-delegazione", ovvero non è possibile bloccare un blocco in un thread e passare la proprietà a un altro thread, il che rende estremamente importante l'implementazione di tali blocchi difficile.
A mio parere, la terza ragione è più filosofica - se non si desidera bloccare - utilizzare tecniche non di blocco, come l'utilizzo di IO asincrono, algoritmi senza blocco e strutture dati. Se il collo di bottiglia della tua applicazione è pesante contesa e il sovraccarico di blocco attorno ad esso, è possibile riprogettare l'applicazione in forma diversa senza dover ricorrere a blocchi asincroni.
fonte
2016-03-15 18:47:04
Conosco questa domanda sui monitor, ma esistono alcune primitive di sincronizzazione che offrono operazioni asincrone: https://msdn.microsoft.com/en-us/library/hh462723.aspx –
È assolutamente possibile! È solo difficile scrivere (e più difficile da usare correttamente), e non è stato adattato nella classe 'Monitor' esistente perché' Monitor' è un tipo piuttosto fondamentale per cominciare, e questo è un caso piuttosto sofisticato (assumendo che tu sia davvero, ne hanno davvero bisogno). Vedi https://github.com/StephenCleary/AsyncEx/wiki/AsyncMonitor per un'implementazione. –
È possibile implementare ma le cose vanno male quando si tenta di utilizzarlo. http://stackoverflow.com/questions/7612602/why-cant-i-use-the-await-operator-within-the-body-of-a-lock-statement – vcsjones