public async Task EnsureStartedAsync(string fileName = null)
        {
            using (await _lock.LockAsync())
            {
                try
                {
                    //we keep just one instance of the server manager per projec
                    if (CurrentProject != null &&
                        GetActiveProject(fileName).UniqueName != GetCurrentProjectUniqueNameSafely())
                    {
                        _overwriteTemplatesDuringNextSync = true;
                        await StopAsync();
                    }

                    Trace.WriteLine("Creating server");
                    _serverManager = _serverManager ?? CreateServerManager(fileName);
                    Trace.WriteLine("Created");

                    await
                    RemoteTask.ClientComplete(_serverManager.EnsureStartedAsync(), CancellationToken.None)
                    .ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    CurrentProject = null;
                    _serverManager = null;
                    Trace.TraceError("Failed to start jsreport server " + e);
                    throw;
                }
            }
        }
        public async Task EnsureStartedAsync(string fileName = null)
        {
            using (await _lock.LockAsync())
            {
                try
                {
                    //we keep just one instance of the server manager per projec
                    if (CurrentProject != null &&
                        GetActiveProject(fileName).UniqueName != GetCurrentProjectUniqueNameSafely())
                    {
                        _overwriteTemplatesDuringNextSync = true;
                        await StopAsync();
                    }

                    Trace.WriteLine("Creating server");
                    _serverManager = _serverManager ?? CreateServerManager(fileName);
                    Trace.WriteLine("Created");

                    await
                        RemoteTask.ClientComplete(_serverManager.EnsureStartedAsync(), CancellationToken.None)
                            .ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    CurrentProject = null;
                    _serverManager = null;
                    Trace.TraceError("Failed to start jsreport server " + e);
                    throw;
                }
            }
        }
        public async Task StopAsync()
        {
            using (await _lock.LockAsync())
            {
                Trace.WriteLine("Stopping server");
                try
                {
                    ClearCache();

                    if (_serverManager != null)
                    {
                        IReportingServerManager tmpServerManager = _serverManager;
                        _serverManager = null;
                        await
                        RemoteTask.ClientComplete(tmpServerManager.StopAsync(), CancellationToken.None)
                        .ConfigureAwait(false);
                    }
                }
                //stopping does not need to go well
                catch (Exception e)
                {
                    Trace.TraceError(e.ToString());
                }
                finally
                {
                    Trace.WriteLine("Stoppedr");
                }
            }
        }
        public async Task StopAsync()
        {
            using (await _lock.LockAsync())
            {
                Trace.WriteLine("Stopping server");
                try
                {
                    ClearCache();

                    if (_serverManager != null)
                    {
                        IReportingServerManager tmpServerManager = _serverManager;
                        _serverManager = null;
                        await
                            RemoteTask.ClientComplete(tmpServerManager.StopAsync(), CancellationToken.None)
                                .ConfigureAwait(false);
                    }
                }
                    //stopping does not need to go well 
                catch (Exception e)
                {
                    Trace.TraceError(e.ToString());
                }
                finally
                {
                    Trace.WriteLine("Stoppedr");
                }
            }
        }