0

以下代码 -scheduler.vb- 模拟使用 ASP.NET 运行计划作业的 Windows 服务。更多信息:http: //beckelman.net/post/2008/09/20/Simulate-a-Windows-Service-Using-ASPNET-to-Run-Scheduled-Jobs.aspx

但是,当我尝试在 global.asax 中运行该类时,出现以下错误(在 RunScheduledTasks 上突出显示):“表达式不产生值”,为什么?谢谢。

全球.asax

 Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    Scheduler.Run("test", 1, RunScheduledTasks)
End Sub


 Public Sub RunScheduledTasks()
 'Do stuff here
 end Sub

调度程序.vb

 Public Class Scheduler
Private Class CacheItem
    Public Name As String
    Public Callback As Callback
    Public Cache As Cache
    Public LastRun As DateTime
End Class

Public Delegate Sub Callback()

Private Shared _numberOfMinutes As Integer = 1

Public Shared Sub Run(ByVal name As String, ByVal minutes As Integer, ByVal callbackMethod As Callback)
    _numberOfMinutes = minutes

    Dim cache As New CacheItem()
    cache.Name = name
    cache.Callback = callbackMethod
    cache.Cache = HttpRuntime.Cache
    cache.LastRun = DateTime.Now
    AddCacheObject(cache)
End Sub

Private Shared Sub AddCacheObject(ByVal cache_1 As CacheItem)
    If cache_1.Cache(cache_1.Name) Is Nothing Then
        cache_1.Cache.Add(cache_1.Name, cache_1, Nothing, DateTime.Now.AddMinutes(_numberOfMinutes), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, _
         AddressOf CacheCallback)
    End If
End Sub

Private Shared Sub CacheCallback(ByVal key As String, ByVal value As Object, ByVal reason As CacheItemRemovedReason)
    Dim obj_cache As CacheItem = DirectCast(value, CacheItem)
    If obj_cache.LastRun < DateTime.Now Then
        If obj_cache.Callback IsNot Nothing Then
            obj_cache.Callback.Invoke()
        End If
        obj_cache.LastRun = DateTime.Now
    End If
    AddCacheObject(obj_cache)
End Sub
End Class
4

1 回答 1

0

查看您提供的链接,看起来这可能是从 C# 到 VB 的错误转换。C# 代码会自动创建一个Callback委托,RunScheduledTasks并将其作为目标传递给Scheduler.Run.

我怀疑您的 VB.Net 代码正在查看这一行:

Scheduler.Run("test", 1, RunScheduledTasks)

并期望 RunScheduledTasks 是一个返回Callback委托的函数。不幸的是,我不知道 VB.Net,所以我在这里猜测。AddressOf如果您添加运算符(链接),也许它会起作用,如下所示:

Scheduler.Run("test", 1, AddressOf RunScheduledTasks)
于 2010-12-02T14:44:45.067 回答