protected override DataSet ServerProcessInternal(DataSet ds)
        {
            if (serviceUri == "(local)")
                return LocalProcess(ds);

            string hash = DataSetDiskCache.ComputeHash(ds);

            DataSet proxyDataSet = null;

            // Creating new DataSet at the service.
            // TODO: fix following:       
            try
            {
                try
                {
                    proxyDataSet = ProxyDataSet.CreateProxySync(taskQueue, ServicePort, "msds:memory", false, 10 * 60 * 1000);
                }
                catch (CommunicationObjectFaultedException)
                {
                    //Connection to server closed.
                    //Recreate service port and try again.
                    if (proxyDataSet != null && !proxyDataSet.IsDisposed) proxyDataSet.Dispose();
                    this._servicePort = null;
                    proxyDataSet = ProxyDataSet.CreateProxySync(taskQueue, ServicePort, "msds:memory", false, 10 * 60 * 1000);
                }
                AutoResetEvent completed = new AutoResetEvent(false);
                OnCommittedHandler onCommitted = new OnCommittedHandler(completed, OnDataSetCommitted);
                proxyDataSet.Committed += onCommitted.Handler;

                proxyDataSet.IsAutocommitEnabled = false;
                FetchClimateRequestBuilder.CopyRequestedDataSet(ds, proxyDataSet, false);
                proxyDataSet.Metadata[Namings.metadataNameHash] = hash;
                proxyDataSet.Commit();

                if (proxyDataSet.HasChanges) proxyDataSet.Commit();

                completed.WaitOne();
                proxyDataSet.IsAutocommitEnabled = true;
                return proxyDataSet;
            }
            catch
            {
                if (proxyDataSet != null && !proxyDataSet.IsDisposed) proxyDataSet.Dispose();
                throw;
            }
        }
 private void OnDataSetCommitted(DataSetCommittedEventArgs e, OnCommittedHandler handler)
 {
     if ((e.Changes.ChangesetSource & ChangesetSource.Remote) == 0)
     {
         return; // we're waiting for remote changes
     }
     var ds = e.DataSet;
     if (FetchClimateRequestBuilder.IsProcessingSuccessful(ds) || FetchClimateRequestBuilder.IsProcessingFailed(ds))
     {
         ds.Committed -= handler.Handler;
         handler.Completed.Set();
     }
 }