У меня есть служба 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>
Я не уверен, что вы подразумеваете под ** общим размером **? для меня это выглядит как ** полный **. * Когда у меня мало документов (ниже 100, а общий размер документов составляет 30 Мб), * становится «когда у меня есть ** несколько ** документов, ** меньше ** 100, а ** общий ** размер документов 30MB ... – poupou
Да, вы правы. Я исправил свой вопрос. – alexmac