|  | @@ -3,6 +3,7 @@
 | 
	
		
			
				|  |  |  // See the LICENSE file in the project root for more information. 
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  using System.Reactive.Disposables;
 | 
	
		
			
				|  |  | +using System.Threading;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace System.Reactive
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -25,12 +26,16 @@ namespace System.Reactive
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public void Dispose()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            Dispose(true);
 | 
	
		
			
				|  |  | +            if (Interlocked.Exchange(ref _observer, NopObserver<TTarget>.Instance) != NopObserver<TTarget>.Instance)
 | 
	
		
			
				|  |  | +                Dispose(true);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          protected virtual void Dispose(bool disposing)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            _observer = NopObserver<TTarget>.Instance;
 | 
	
		
			
				|  |  | +            //Calling base.Dispose(true) is not a proper disposal, so we can omit the assignment here.
 | 
	
		
			
				|  |  | +            //Sink is internal so this can pretty much be enforced.
 | 
	
		
			
				|  |  | +            //_observer = NopObserver<TTarget>.Instance;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              Disposable.TryDispose(ref _upstream);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 |