我有一个小型网络应用程序,可以生成PDF文件作为报告。我试图在生成它们10秒后删除生成的PDF文件。我想要做的是每隔10秒读取一个包含PDF文件的文件夹,并删除该文件夹中的所有PDF文件。
我读了这个post of Easy Background Tasks in ASP.NET。以下代码是VB版本。
Protected Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
AddTask("DoStuff", 10)
End Sub
Private Sub AddTask(ByVal name As String, ByVal seconds As Integer)
OnCacheRemove = New CacheItemRemovedCallback(CacheItemRemoved)
HttpRuntime.Cache.Insert(name, seconds, Nothing, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, _
OnCacheRemove)
End Sub
Public Sub CacheItemRemoved(ByVal k As String, ByVal v As Object, ByVal r As CacheItemRemovedReason)
' do stuff here if it matches our taskname, like WebRequest
DeletePDFilesInFoler()
' re-add our task so it recurs
AddTask(k, Convert.ToInt32(v))
End Sub
但是我收到了这个错误
代表 'System.Web.Caching.CacheItemRemovedCallback' 需要'AddressOf'表达式或 lambda表达式作为唯一的参数 它的构造函数。
如果此代码有效,我应该把它放在哪里。是的,现在我把它放在母版页中。如何解决这个错误?
谢谢
答案 0 :(得分:1)
错误在错误消息中,您遗漏了AddressOf
。试试这个:
OnCacheRemove = New CacheItemRemovedCallback(AddressOf CacheItemRemoved)
答案 1 :(得分:1)
为什么不在每次生成PDF时查找旧PDF并删除它们,而不是按计划删除它们?
的伪代码:
/* Clean up old PDFs */
If Not StaticCleaningUpPDFsNow Then
// No other reports generating simultaneously and trying to delete old PDFs
StaticCleaningUpPDFsNow = True
For each f in (reportfolder\*.pdf)
If f.DateCreated.AddSeconds(10) < Now Then f.Delete
Next
StaticCleaningUpPDFsNow = False
End If
/* Create PDF for the current report */
...
在文件夹中查找文件并删除一些文件的开销非常小,按需执行此操作可以更好地利用资源,而不会遇到缓存过期(以及可能导致的边缘情况)的问题。 / p>