我们有一个使用Exchange Web Service的服务应用程序。 我们遇到内存问题如果我在服务中调用以下代码行之一,则会导致服务应用程序中发生内存泄漏。 用户应用程序处理大量电子邮件,因此内存使用量将持续增加,并且永远不会释放。
代码示例。
var item = Item.Bind(mServiceWrapper.Service, ItemId.UniqueId);
var folder = Folder.Bind(mServiceWrapper.Service,item.ParentFolderId.UniqueId);
EmailMessage.Load(new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent));
但是,如果我以UI应用程序形式启动程序,则一切正常,而不会发生内存泄漏。 仅当将我们的程序作为服务启动时,才会出现此问题。 问题已经为您所知,您有解决方案吗?
我正在使用EWS中的StreamingSubscript。获取Emailas Exchange Server并将其存储在数据库中。
private void OnNotificationEvent(object sender, NotificationEventArgs args)
{
var item = Item.Bind(mServiceWrapper.Service, mailItem.ItemId.UniqueId);
var folder = Folder.Bind(mServiceWrapper.Service, mailItem.ParentFolderId.UniqueId);
var propertySet = new PropertySet(BasePropertySet.FirstClassProperties);
item.Load(propertySet);
folder.Load(PropertiesProvider.FolderPropertySet);
object[] data = new object[]
{
item.Id.UniqueId,
folder.Id.UniqueId,
folder.ExtendedProperties.GetPropertyValue<long>(@"LexolutionContainerId"),
folder.ExtendedProperties.GetPropertyValue<int>(@"TrayId")
};
}
另一个线程将加载电子邮件并再次处理电子邮件。像这样
protected override void InternalWork(IJob job)
{
try
{
object[] data = (object[]) job.DataObject;
string itemUniqueId = (string) data[0];
ItemId itemId = new ItemId(itemUniqueId);
long targetContainerId = (long) data[2];
var propertySet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent,
EmailMessageSchema.InternetMessageId);
var mail = Item.Bind(ExchangeWrapper.Service, itemId, propertySet);
}
}
答案 0 :(得分:1)
您实际上没有给我们足够的代码来确定您的问题是什么-但我可以猜测您没有正确处理项目和/或未调用GC。
作为第一步(也是一般惯例),我将重构您的代码以使用using语句。因此,上面的代码将如下所示:
var item = Item.Bind(mServiceWrapper.Service, ItemId.UniqueId);
var folder = Folder.Bind(mServiceWrapper.Service,item.ParentFolderId.UniqueId);
using (var props = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent))
{
EmailMessage.Load(props);
// additional code
}
在代码中可能还有其他地方可以使用,这是一些文档 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
此外,您还应考虑强制GC在服务中运行。这也可能是您的问题。