TLDR: This behavior is absolutely normal.
Why can't Lease Management be smooth & exception-free: To give more control on the situation to developer.
The really long story - all-the-way from Basics
EventProcessorhost (hereby EPH - is very similar to what __consumer_offset topic does for Kafka Consumers - partition ownership & checkpoint store) is written by Microsoft Azure EventHubs team themselves - to translate all of the EventHubs partition receiver Gu into a simple onReceive(Events) callback.
EPH is used to address 2 general, major, well-known problems while reading out of a high-throughput partitioned streams like EventHubs:
- fault tolerant receive pipe-line - for ex: a simpler version of the problem - if the host running a - PartitionReceiverdies and comes back - it needs to resume processing from where it left. To remember the last successfully processed- EventData,- EPHuses the- blobsupplied to- EPHconstructor to store the checkpoints - when ever user invokes- context.CheckpointAsync(). Eventually, when the host process dies (for ex: abruptly reboots or hits a hardware fault and never/comesback) - any- EPHinstance can pick up this task and resume from that- Checkpoint.
 
- Balance/distribute partitions across - EPHinstances - lets say, if there are 10 partitions and 2- EPHinstances processing events from these 10 partitions - we need a way to divide partitions across the instances (- PartitionManagercomponent of- EPHlibrary does this). We use- Azure Storage - Blob LeaseManagement-featureto implement this. As of version- 2.2.10- to simplify the problem,- EPHassumes that all partitions are loaded equally.
 
With this, lets try to see what's going on:
So, to start with, in the above example of 10 event hub partitions and 2 EPH instances processing events out of them: 
- lets say the first EPHinstance -EPH1started, at-first, alone and a part of start-up, it created receivers to all 10 partitions and is processing events. In the start up -EPH1will announce that it owns all these10partitions by acquiring Leases on10storage blobs representing these10event hub partitions (with a standardnomenclature- whichEPHinternally creates in the Storage account - from theStorageConnectionStringpassed to thector). Leases will be acquired for a set time, after which theEPHinstance will loose the ownership on this Partition.
- EPH1continually- announcesonce in a while - that it is still owning those partitions - by- renewingleases on the blob. Frequency of- renewal, along with other useful tuning, can be performed using- PartitionManagerOptions
- now, lets say, EPH2starts up - and you supplied the sameAzureStorageAccountasEPH1to thectorofEPH2as well. Right now, it has0partitions to process. So, to achieve balance of partitions acrossEPHinstances, it will go ahead anddownloadthe list of allleaseblobswhich has the mapping ofownertopartitionId. From this, it willSTEALleases for its fair share ofpartitions- which is5in our example, and will announce that information on thatlease blob. As part of this,EPH2reads the latest checkpoint written byPartitionXit wants to steal the lease for and goes ahead and creates correspondingPartitionReceiver's with theEPOCHsame as the one in theCheckpoint.
- As a result, EPH1will loose ownership of these 5partitionsand will run into different errors based on the exact state it is in.
- if EPH1is actually invoking thePartitionReceiver.Receive()call - whileEPH2is creating thePartitionReceiveron the same receiver -EPH1will experience ReceiverDisconnectedException. This will eventually, invokeIEventProcessor.Close(CloseReason=LeaseLost). Note that, probability of hitting this specific Exception is higher, if the messages being received are larger or thePrefetchCountis smaller - as in both cases the receiver would be performing more aggressive I/O.
- if EPH1is in the state ofcheckpointingtheleaseorrenewingthelease, while theEPH2stolethe lease, theEventProcessorOptions.ExceptionReceivedeventHandler would be signaled with aleaselostException(with409conflict error on theleaseblob) - which also eventually invokesIEventProcess.Close(LeaseLost).
 
Why can't Lease Management be smooth & exception-free:
To keep the consumer simple and error-free, lease management related exceptions could have been swallowed by EPH and not notified to the user-code at all. However, we realized, throwing LeaseLostException could empower customers to find interesting bugs in IEventProcessor.ProcessEvents() callback - for which the symptom would be - frequent partition-moves 
- minor network outage on a specific machine - due to which EPH1fails torenewleases and comes back up! - and imagine if the n/w of this machine stands flaky for a day -EPHinstances are going to playping-pongwithPartitions! This machine will continuously try to steal the lease from other machine - which is legitimate fromEPHpoint-of-view - but, is a total disaster for the user ofEPH- as it completely interferes with the processing pipe.EPH- would exactly see aReceiverDisconnectedException, when the n/w comes back up on this flaky m/c! We think the best and infact the only way is to enable the developer to smell this!
- or a simple scenario like, having a bug in ProcessEventslogic - which throws unhandled exceptions which are fatal and brings down the whole process - ex: a poison event. This partition is going to move around a lot.
- customers, performing write/delete operations on the same storage account which EPHis also using - by mistake (like an automated clean-up script) etc.
- last but not the least - which we never wish could happen - say a 5 min outageon Azure d.c where a specificEventHub.Partitionis located - say n/w incident. Partitions are going to move around acrossEPHinstances.
Basically, in majority of situations, it would be tricky - for us to detect the diff. between these situations and a legitimate leaseLost due to balancing and we want to delegate control of these situations to the Developer.
more on Event Hubs...