GC.KeepAlive may not work the way you intend when using it in async methods.
This article explains how AsyncLocal values are stored inĀ .NET and how to retrieve them from a memory dump.
Explaining the ThreadPool starvation issue, and how it can be made worse by the way work-items are queued.
Leveraging the async machinery to transparently switch to the UI thread when needed.