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デリゲートを自動的に作成します。RunScheduledTasksScheduler.Run

あなたの VB.Net コードは次の行を見ていると思われます。

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

RunScheduledTasks がデリゲートを返す関数であると想定しますCallback。残念ながら、私は VB.Net を知らないので、ここで推測しています。AddressOf次のように、演算子 ( link )を追加するとうまくいくかもしれません。

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