Advice on executing transient projection from C#

This might be down to the way I am calling Transient projections from my code, but on our cloud system we would see the memory usage of our Event Store keep on climbing (gigs), even when the system is relatively quiet (100 events per minute).
We have Transient projection fired roughly 4 times per minute.

Taking that out of the equation, the ram issue stops.

I have created a little test harness working on a local Event Store where I fired a Transient Projection for a short burst (100 iterations, creating a new Thread, and sleeping 250ms in between each new Thread starting)

The Ram usage started at 47mb on the freshly started Event Store and kept climbing, even after all 100 Projections returned their results (and is still slowly climbing)

The projection itself runs over a stream with < 10 events and increments a counter.

So that’s the issue (version 4.0.3)

It may well be down to the way I start and process Projections, so open to suggestions on what I could be doing wrong.

Below is the method I wrote. (ProjectionStatus is a little help class I use for checking if the Projection has reach 100% or faulted)

public async Task ExecuteTransientProjectionAsync(String query, CancellationToken cancellationToken)
{
Vme.EventStore.EventStore.EventStoreContext.EventStoreContext.GuardAgainstEmptyValue(query, “query”);

ProjectionsManager projectionsManager = this.CreateProjectionsManager();
String queryname = Vme.EventStore.EventStore.EventStoreContext.EventStoreContext.GenerateQueryName();

//Create the query (and wait)
await projectionsManager.CreateTransientAsync(queryname, query, this.DefaultUserCredentials);

Task<String> result = Task.Factory.StartNew(() =>
                                            {
                                                while (true)
                                                {
                                                    String json = projectionsManager.GetStatusAsync(queryname, this.DefaultUserCredentials).Result;
                                                    ProjectionStatus status = ProjectionStatus.CreateFromJson(json);

                                                    if (status.HasFaulted())
                                                    {
                                                        throw new Exception(status.GetStateReason());
                                                    }

                                                    //We need to wait until the query has been run before we continue.
                                                    if (status.HasCompleted())
                                                    {
                                                        return projectionsManager.GetStateAsync(queryname, this.DefaultUserCredentials).Result;
                                                    }

                                                    if (cancellationToken.IsCancellationRequested)
                                                    {
                                                        //Lets get out of here quickly as possible.
                                                        cancellationToken.ThrowIfCancellationRequested();
                                                    }

                                                    Task.Delay(20, cancellationToken); //Is this too short a sleep?
                                                }
                                            },
                                            cancellationToken);

if (!result.Wait(5000, cancellationToken))
{
    return await Task.FromResult<String>(null);
}

return result.Result;

}

``