本教程展示了如何在WinForms c#应用程序中使用Document Viewer中的非持久内存缓存。这个缓存将保存从互联网加载的文件的信息。
概述 | |
---|---|
总结 | 本教程介绍如何在c# Windows WinForms应用程序中为文档查看器实现内存缓存。 |
完成时间 | 30分钟 |
项目 | 下载教程项目(14kb) |
平台 | Windows WinForms c#应用程序 |
IDE | Visual Studio 2022 |
开发许可 | 下载LEADTOOLS |
方法,熟悉在文档查看器中创建项目和加载图像的基本步骤添加引用和设置License而且在文档查看器中显示文件教程,在工作之前使用内存缓存与文档查看器- WinForms c#教程。
请注意
有关文档查看器及其缓存功能的更多信息,请参见文档工具箱和缓存.
中创建的项目的副本开始在文档查看器中显示文件教程。如果您没有该项目,请按照该教程中的步骤创建它。
所需要的参考资料取决于项目的目的。引用可以通过以下两种方法中的一种添加(但不能同时添加)。
如果使用NuGet引用,本教程需要以下NuGet包:
Leadtools.Document.Sdk
Leadtools.Document.Viewer.WinForms
NUnit
如果使用本地DLL引用,则需要以下DLL。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ DotNet4 \ x64
:
Leadtools.dll
Leadtools.Caching.dll
Leadtools.Codecs.dll
Leadtools.Controls.WinForms.dll
Leadtools.Document.dll
Leadtools.Document.Pdf.dll
Leadtools.Document.Viewer.WinForms.dll
nunit.framework.dll
有关应用程序需要哪些DLL文件的完整列表,请参阅你的申请中包含的文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
随着项目的创建、引用的添加和许可的设置,编码就可以开始了。
在解决方案资源管理器,右键单击项目文件并选择Add ->类.这将会带来添加新项目对话框中,添加MemoryCache.cs
为了名字。点击添加将类添加到项目中。
在新添加的类中,将以下using语句添加到顶部
使用系统;
使用System.Collections.Concurrent;
使用System.Collections.Generic;
使用Leadtools.Caching;
添加MemoryCache
作为ObjectCache
类。将下面的代码添加到MemoryCache
类:
名称空间MemoryCaching
{
公共类MemoryCache: ObjectCache
{
//缓存。字符串|对象的并发字典
私人ConcurrentDictionary最后<字符串,对象> _cache =新ConcurrentDictionary最后<字符串,对象> ();
//
//这些成员必须由我们的类实现,并由Document工具箱调用
//
//我们的名字
公共覆盖字符串名字
{
得到
{
返回“内存缓存”;
}
}
//我们只支持二进制序列化。实际上,我们既不支持策略也不支持序列化,但是我们返回Binary
//通知任何呼叫者不要给我们发送任何JSON数据
公共覆盖CacheSerializationMode PolicySerializationMode
{
得到
{
返回CacheSerializationMode.Binary;
}
集
{
扔新NotSupportedException(由于);
}
}
公共覆盖CacheSerializationMode DataSerializationMode
{
得到
{
返回CacheSerializationMode.Binary;
}
集
{
扔新NotSupportedException(由于);
}
}
//我们没有特别的额外支持
公共覆盖DefaultCacheCapabilities DefaultCacheCapabilities
{
得到
{
返回DefaultCacheCapabilities.None;
}
}
//该函数处理将文档添加到缓存的所有后端
//你不需要手动调用这个函数,它是由
//文档工厂
公共覆盖CacheItem
AddOrGetExisting (CacheItem item, CacheItemPolicy policy) {
如果(项目= =零)
扔新ArgumentNullException (“项目”);
控制台。WriteLine (“添加到缓存”);
//解析键,记住,我们没有区域
varResolveKey = ResolveKey(项目。RegionName item.Key);
CacheItem
oldItem =零; //尝试获取旧值
//是的,保存旧值返回给用户
对象oldPayload;
如果(_cache。TryGetValue (resolvedKey出oldPayload))
oldItem =新CacheItem < T >(项目。Key, (T)oldPayload, item.RegionName);
//设置新数据
_cache。TryAdd (resolvedKey item.Value);
//返回旧项目
返回oldItem;
}
//从缓存中检索缓存项的函数
//区域和键
公共覆盖CacheItem < T > GetCacheItem < T > (字符串键,字符串regionName)
{
//如果我们有一个带有此键的项,则返回它。否则,返回null
varresolvedKey = ResolveKey(regionName, key);
CacheItem
item =零; 对象有效载荷;
如果(_cache。TryGetValue (resolvedKey出有效载荷)
项=新CacheItem
(key, (T)payload, regionName); 返回项;
}
公共覆盖保龄球包含(字符串键,字符串regionName)
{
//检查键是否在字典中
varresolvedKey = ResolveKey(regionName, key);
varexists = _cache.ContainsKey(resolvedKey);
返回存在;
}
公共覆盖保龄球UpdateCacheItem < T > (CacheItem < T >项)
{
//更新项目
如果(项目= =零)
扔新ArgumentNullException (“项目”);
varResolveKey = ResolveKey(项目。RegionName item.Key);
varexists = _cache.ContainsKey(resolvedKey);
如果(存在)
_cache[resolvedKey] = item.Value;
返回存在;
}
公共覆盖T删除< T > (字符串键,字符串regionName)
{
//如果存在,则返回旧值
varresolvedKey = ResolveKey(regionName, key);
对象有效载荷;
varremove = _cache。TryRemove (resolvedKey出有效载荷);
返回删除吗?(T)有效载荷:默认的(T);
}
公共覆盖无效DeleteItem (字符串键,字符串regionName)
{
//如果存在则删除
varresolvedKey = ResolveKey(regionName, key);
对象有效载荷;
_cache。TryRemove (resolvedKey出有效载荷);
}
私人静态字符串ResolveKey (字符串regionName,字符串键)
{
//两个字符串都必须为非空字符串
如果(字符串.IsNullOrEmpty (regionName))扔新InvalidOperationException (“地区名称必须是非空字符串”);
如果(字符串.IsNullOrEmpty(关键))扔新InvalidOperationException ("区域键名必须是非空字符串");
//我们是一个没有分组的简单字典。regionName可能不是唯一的,key也可能不是唯一的,而是将它们组合在一起
//我们保证有一个唯一的密钥
返回regionName +“-”+关键;
}
公共覆盖无效UpdatePolicy (字符串key, CacheItemPolicy策略字符串regionName)
{
//无事可做
}
}
}
的底部添加以下代码MemoryCache
类来覆盖文档查看器不支持的函数。如果没有添加,这些函数都会抛出NotSupportedException
.
//这些成员必须由我们的类过度实现,但绝不会被Documents工具包调用
//抛出一个不支持的异常
//这是默认区域支持。我们没有
公共覆盖对象这[字符串例子)
{
得到
{
扔新NotSupportedException(由于);
}
集
{
扔新NotSupportedException(由于);
}
}
//一次性删除一个区域我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities.CacheRegions时才会被调用。因为我们不这样做,所以调用者负责
//调用DeleteAll传递区域的所有项目(依次调用每个项目的DeleteItem)
公共覆盖无效DeleteRegion (字符串regionName)
{
扔新NotSupportedException(由于);
}
//开始添加外部资源我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖Uri BeginAddExternalResource (字符串键,字符串regionName,保龄球读写)
{
扔新NotSupportedException(由于);
}
//结束添加外部资源。我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖无效EndAddExternalResource < T > (保龄球提交,字符串key, T值,CacheItemPolicy策略,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取项目外部资源。我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖Uri GetItemExternalResource (字符串键,字符串regionName,保龄球读写)
{
扔新NotSupportedException(由于);
}
//删除项目外部资源。我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖无效RemoveItemExternalResource (字符串键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取项目虚拟目录路径我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。VirtualDirectory
公共覆盖Uri GetItemVirtualDirectoryUrl (字符串键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取缓存中的条目数。我们对此不支持
公共覆盖长GetCount (字符串regionName)
{
扔新NotSupportedException(由于);
}
/ /统计数据。我们对此不支持
公共覆盖CacheStatistics GetStatistics ()
{
扔新NotSupportedException(由于);
}
/ /统计数据。我们对此不支持
公共覆盖CacheStatistics GetStatistics (字符串键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取所有的值。我们对此不支持
公共覆盖IDictionary <字符串,对象> getvalue (IEnumerable <字符串>键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//项目的枚举。我们对此不支持
受保护的覆盖IEnumerator < KeyValuePair <字符串,对象> > GetEnumerator ()
{
扔新NotSupportedException(由于);
}
//键的枚举我们对此不支持
公共覆盖无效EnumerateKeys (字符串区域,EnumerateCacheEntriesCallback
{
扔新NotSupportedException(由于);
}
//区域的枚举。我们对此不支持
公共覆盖无效EnumerateRegions (EnumerateCacheEntriesCallback回调)
{
扔新NotSupportedException(由于);
}
MemoryCache
作为文档查看器中的活动缓存去Form1.cs
类,并确保包含下面的using语句。
使用系统;
使用先;
使用System.Drawing;
使用System.Windows.Forms;
使用Leadtools;
使用Leadtools.Document;
使用Leadtools.Caching;
使用Leadtools.Document.Viewer;
使用Leadtools.Controls;
使用System.Collections.Generic;
使用NUnit.Framework;
删除的实例FileCache
并在下面添加全局变量:
/ /删除
//private FileCache _cache;
/ /添加
私人MemoryCache _cache;
调整InitDocumentViewer ()
方法添加到下面的代码:
私人无效InitDocumentViewer ()
{
InitUI ();
varcreateOptions =新DocumentViewerCreateOptions ();
//设置文档查看器显示的UI部分
createOptions。ViewContainer =这.Controls.Find (“docViewerPanel”,假) [0];
//设置显示缩略图的UI部分
createOptions。ThumbnailsContainer =这.Controls.Find (“thumbPanel”,假) [0];
//暂不使用注释
createOptions。UseAnnotations =假;
//现在创建查看器
_documentViewer = DocumentViewerFactory.CreateDocumentViewer(createOptions);
_documentViewer.View.ImageViewer.Zoom (ControlSizeMode。FitAlways, 1.0, _documentViewer.View.ImageViewer.DefaultZoomOrigin);
_cache =新MemoryCache ();
_virtualDocument = DocumentFactory。创建(新CreateDocumentOptions() {Cache = _cache, UseCache =真正的});
}
在解决方案资源管理器,右键单击项目文件并选择Add ->窗体(Windows窗体).这将会带来添加新项目对话框中,把OpenDocumentUrlDialog.cs
获取名称并单击添加.
打开OpenDocumentUrlDialog.Desginer.cs
文件。将下面的代码添加到InitializeComponent ()
函数。
私人无效InitializeComponent ()
{
这._txtBox_Url =新System.Windows.Forms.TextBox ();
这._Load =新System.Windows.Forms.Button ();
这._UrlLabel =新System.Windows.Forms.Label ();
这.SuspendLayout ();
//
/ / _txtBox_Url
//
这._txtBox_Url。位置=新System.Drawing。38点(12日);
这._txtBox_Url。Name =“_txtBox_Url”;
这._txtBox_Url。大小=新System.Drawing。大小(776年,20);
这._txtBox_Url。TabIndex = 0;
这._txtBox_Url。文本=“http://demo.leadtools.com/images/pdf/leadtools.pdf”;
//
/ / _Load
//
这._Load。位置=新System.Drawing。点(713、64);
这._Load。Name =“_Load”;
这._Load。大小=新System.Drawing。大小(75年,28);
这._Load。TabIndex = 1;
这._Load。文本=“装”;
这._Load。UseVisualStyleBackColor =真正的;
这._Load。点击+= (sender, e) => LoadBtn_Click();
//
/ / _UrlLabel
//
这._UrlLabel。AutoSize =真正的;
这._UrlLabel。位置=新System.Drawing。点(12、22);
这._UrlLabel。Name =“_UrlLabel”;
这._UrlLabel。大小=新System.Drawing。大小(20日13);
这._UrlLabel。TabIndex = 2;
这._UrlLabel。文本=“Url”;
//
/ / OpenDocumentUrlDialog
//
这.AutoScaleDimensions =新System.Drawing。SizeF (6 f, 13 f);
这.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
这.ClientSize =新System.Drawing。规模(800、116);
这.Controls.Add (这._UrlLabel);
这.Controls.Add (这._Load);
这.Controls.Add (这._txtBox_Url);
这. name =“OpenDocumentUrlDialog”;
这。text =“OpenDocumentFromUrlDialog”;
这.ResumeLayout (假);
这.PerformLayout ();
}
添加下面的变量# endregion
.
私人System.Windows.Forms.TextBox _txtBox_Url;
私人System.Windows.Forms.Button _Load;
私人System.Windows.Forms.Label _UrlLabel;
右键单击OpenDocumentUrlDialog.cs
并选择视图代码来显示表单后面的代码。将以下变量添加到类的顶部。
公共字符串url {得到{返回_txtBox_Url.Text;}}
在OpenDocuemntUrlDialog
类,添加下面的函数。
私人无效LoadBtn_Click ()
{
这.Close ();
}
右键单击Form1.cs
并选择视图代码来显示表单后面的代码。控件中添加和新建方法Form1
类命名ShowDocumentCacheInfo(ObjectCache缓存,字符串documentId)
.方法中调用此方法LoadDocumentFromUri
函数在下面的部分中创建,就在BeginUpdate ()
调用。将下面的代码添加到新方法中以显示缓存信息。
私人静态无效ShowDocumentCacheInfo (ObjectCache缓存,字符串documentId)
{
//我们知道文档ID是缓存区域ID
//我们也知道一个文档可以包含多个缓存项
//我们也知道,所有可能属于一个文档的项都可以通过LEADDocument获得。GetCacheKeys
//首先从缓存中加载文档
varloadFromCacheOptions =新LoadFromCacheOptions ();
loadFromCacheOptions。Cache = Cache;
loadFromCacheOptions。文档Id = documentId;
使用(vardocument = DocumentFactory.LoadFromCache(loadFromCacheOptions))
{
//这是为了证明没有必要保留全局“cache”对象GetCache
//为文档返回它
ObjectCache documentCache = document.GetCache();
Assert.IsNotNull (documentCache);
//获取所有可能的缓存键
//这些键在缓存中可能存在,也可能不存在,这取决于文档的哪一部分被缓存。
//例如,如果DocumentCacheOptions. conf在文档中设置了PageImage,图像被缓存,然后有一个项目用于它
控制台。WriteLine ($"document {documentId}缓存策略:");
ISet <字符串> cacheKeys = document.GetCacheKeys();
foreach(字符串cacheKey在cacheKeys)
{
//是否存在?
如果(documentCache。包含(cacheKey,document.DocumentId))
{
//获取策略
CacheItemPolicy = documentCache。GetPolicy (cacheKey document.DocumentId);
//这个演示设置了一个绝对过期,但这是通用代码
//可以通过检查值来计算:
DateTime absoluteExpiration = itemPolicy.AbsoluteExpiration;
TimeSpan slidingExpiration = itemPolicy.SlidingExpiration;
DateTime localTimeExpiration;
如果(slidingExpiration != timespan . 0)
{
//有滑动到期,因此到期将是NOW +滑动
localTimeExpiration = DateTime.Now.Add(slidingExpiration);
}
其他的
{
//绝对过期时间存储在UTC,转换为本地
localTimeExpiration = absoluteExpiration.ToLocalTime();
}
//显示过期
控制台。WriteLine ($" key:{cacheKey} expiration at {localTimeExpiration}");
}
}
}
}
在Form1
类添加一个名为LoadDocumentFromUri(按钮)
.添加下面的代码以从URL加载。
公共无效loadButton LoadDocumentFromUri(按钮)
{
字符串url;
使用(vardlg =新OpenDocumentUrlDialog ())
{
了解地理。ShowDialog (这);
Url = dgl . Url;
LEADDocument document = DocumentFactory。LoadFromUri (新Uri (url),新LoadDocumentOptions {UseCache =真正的});
_virtualDocument.Pages.Clear ();
为(intI = 0;i < document.Pages.Count;我+ +)
{
_virtualDocument.Pages.Add (document.Pages[我]);
}
ShowDocumentCacheInfo (_cache _virtualDocument.DocumentId);
_documentViewer.BeginUpdate ();
_documentViewer.SetDocument (_virtualDocument);
_documentViewer.View.Invalidate ();
如果(_documentViewer。缩略图! =零)
_documentViewer.Thumbnails.Invalidate ();
_documentViewer.EndUpdate ();
}
}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行,并允许您将文档加载到查看器中。在查看器中加载文档时,可以在输出窗口Visual Studio.
本教程展示了如何实现内存缓存
为主题是
对象。