проблема в коде планировщика - PullRequest
0 голосов
/ 22 ноября 2010

Следующий код -scheduler.vb- имитирует службу Windows, используя ASP.NET для выполнения запланированных заданий. Больше информации здесь: http://beckelman.net/post/2008/09/20/Simulate-a-Windows-Service-Using-ASPNET-to-Run-Scheduled-Jobs.aspx

Но когда я пытаюсь запустить класс в моем global.asax, я получаю следующую ошибку (выделено в RunScheduledTasks): «Выражение не дает значения», почему ?? Спасибо.

global.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

scheduler.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

1 Ответ

0 голосов
/ 02 декабря 2010

Глядя на предоставленную вами ссылку, похоже, что это может быть неправильное преобразование из 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)
...