I don't think you showed the GetDirectoryEntryWithDC function.
Generally speaking, this type of problem can be hard to fix in SDS as the connection caching mechanism ADSI tries to use is totally hidden from you. Essentially, it WILL try to use an open LDAP connection if you connect to the same server with the same credentials as a connection that is already open. It looks like that is NOT happening for you for some reason. :)
Sometimes you can fix this by opening a single DE object first and keeping it open for the duration of the program. However, sometimes these problems are hard to fix.
We actually do have a whole topic on this in Ch 3 of the book, but it does not always result in getting the problem resolved, just understood a little better.
If you want to take total control, you can switch to SDS.Protocols. You get your own LdapConnection object there that you can reuse to perform multiple requests on and basically never have this problem as long as you are careful to only open one. However, you would have to rewrite all your code to go in this direction.