2012-02-03 5 views
1

У меня есть служба WCF, размещенная на веб-сайте, и приложение Monotouch, которое может отображать и обновлять документы PDF из службы. Размер файлов PDF может быть от 1 байт до 20 Мб. Когда у меня мало документов (менее 100, а общий размер документов - 30 Мб), процесс обновления завершается успешно. Но когда у меня много документов (более 300, а общий размер документов - 100 Мб), моя программа заканчивается на iPad 1, но на iPad 2 все еще работает.Monotouch и WCF, использование памяти

Я думаю, что проблема в использование памяти. iOS убивает мое приложение, когда оно использует много памяти. Но я не знаю, где проблема, может быть, Monotouch GC не очищает память от массивов массивов fileData?

Метод, который обновлять документы на IPad:

protected bool BeginUpdateProcess() 
{ 
    try { 
    var binding = new BasicHttpBinding(); 
    binding.MaxBufferSize = 52428800; 
    binding.MaxBufferPoolSize = binding.MaxReceivedMessageSize = 52428800L; 
    binding.ReaderQuotas.MaxStringContentLength = binding.ReaderQuotas.MaxArrayLength = 52428800; 
    var endpoint = new EndpointAddress(string.Format("http://{0}/Services/UpdateDataService.svc", UpdateInfo.Instance.ServerIP)); 
    using (var dataService = new UpdateDataServiceClient(binding, endpoint)) { 
     // Get document list for update 
     int[] docIds; 
     try { 
      docIds = dataService.GetModifiedDocumentIds(mLastUpdated); 
     } catch (Exception ex) { 
      LogWriter.Instance.WriteToLog("UpdateFromServiceEror: Can't load modified document ids list", ex); 
      return false; 
     } 

     // Get each document content and save it to iPad 
     for (int i = 0; i < docIds.Length; i++) { 
      if (Canceled) { 
       return true; 
      } 
      try { 
       byte[] fileData = dataService.GetDocumentTransData(docIds[i]); 
       SaveDocument(fileData); 
      } catch (Exception ex) { 
       LogWriter.Instance.WriteToLog(string.Format("Can't load or save file, id={0}", docIds[i]), ex); 
       return false; 
      } 
     } 
     dataService.Close(); 
    } 
} catch (Exception ex) { 
    LogWriter.Instance.WriteToLog("Error when update from service", ex); 
} 
} 

Web-сайт настройки WCF:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="Default"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

<bindings> 
    <basicHttpBinding> 
     <binding name="Transport" 
      closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="52428800" maxBufferPoolSize="524288" maxReceivedMessageSize="52428800" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="64" 
         maxStringContentLength="52428800" 
         maxArrayLength="52428800" 
         maxBytesPerRead="16384" 
         maxNameTableCharCount="16384" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 

<services> 
    <service name="iDict.Site.Services.UpdateDataService" behaviorConfiguration="Default"> 
     <host> 
      <baseAddresses> 
       <add baseAddress="http://localhost:57709/Services/UpdateDataService.svc"/> 
      </baseAddresses> 
     </host> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="Transport" contract="iDict.Site.Services.IUpdateDataService" /> 
    </service> 
</services> 

+0

Я не уверен, что вы подразумеваете под ** общим размером **? для меня это выглядит как ** полный **. * Когда у меня мало документов (ниже 100, а общий размер документов составляет 30 Мб), * становится «когда у меня есть ** несколько ** документов, ** меньше ** 100, а ** общий ** размер документов 30MB ... – poupou

+0

Да, вы правы. Я исправил свой вопрос. – alexmac

ответ

1

Вот несколько вещей, которые могли бы помочь вам:

  • 52428800 - ab буфер для устройств;

  • Документы PDF, переданные в XML? Если это так, вы в какой-то момент имеете оба ваших документа PDF в string (не очень эффективный, с памятью) и byte[] fileData. Это может похвастаться доступной оперативной памятью iPad первого поколения. Возможный способ избежать этой ситуации - заставить веб-службу возвращать URL-адреса в файлы. Затем каждый URL-адрес может быть легко удален с веб-сервера в локальный файл без использования большого количества памяти;

  • iPad2 имеет больше оперативной памяти, о чем выше может работать над ними, но в конечном итоге это приведет к сбою больших документов. Между тем использование Stream ограничило бы пространство для хранения устройств;

  • В зависимости от версии MonoTouch вы используете вас may be hit bug #386. Если вы можете предложить вам попробовать последнюю версию MonoTouch (бета на данный момент), которая решает эти проблемы.

Смежные вопросы