0

application_start内で宣言されているスレッドから呼び出す必要があるglobal.asaxファイルに関数を書いています。デバッグ モードでは正常に動作しますが、ホストされているときにコールバック関数を呼び出しません。

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        writeLog("Application Initialized")
        writeLog("Thread is starting....")
        Dim T As New Threading.Thread(AddressOf UpdateQueue)
        T.Start()
        writeLog("Thread Started....")
    End Sub
    Sub UpdateQueue()
        writeLog("UpdateQueue entry")
        While Q.Count > 0
         ' Some logic
        End While
        writeLog("UpdateQueue going for idle state")
        Threading.Thread.Sleep(5000)
        UpdateQueue()
    End Sub

Thread Starting Thread Started のようなログ ファイルが表示されます

しかし、「UpdateQue」関数に出力される他のメッセージはありません。他の方法も試しました。1. タイマーの使用: 上記と同じ問題 2. Thread.Timers の使用: 上記と同じ問題 3. application_start から直接 UpdateQueue 関数を呼び出します: UpdateQue 関数に入り、ログ エントリに書き込みます。

サーバーの問題の理由を理解できません。パブリック IP (ホスティング プロバイダーからではなく) で IIS 7 を使用しているため、必要に応じて変更を加えることができます。

4

2 に答える 2

1

ASP.NETはデスクトップアプリケーションのようには機能しません。スレッドを開始して、それを単独で実行させることはできません。ユーザーがリクエストを実行し、アプリプールがスリープ状態になると、アプリケーションスタートが呼び出されます。ウェイクアップすると、Application Startが呼び出されますが、関数が実行されるとすぐに、作成したスレッドは、ユーザーの残りの要求/応答が完了するまでに終了します。

私が言える最も簡単な方法は、HTTPリクエストで開始するスレッドは、そのユーザーのリクエスト/レスポンスが完了する前に終了する必要があるということです。そうしないと、「スレッドが中止されました」という例外エラーが発生します。

ASP.NETでのスレッド化の最大の用途は、外部リソース(APIなど)の操作です。呼び出しで複数の外部リソースをタップする必要がある場合は、それらすべてを一度に実行できますが、要求/応答が完了する前にそれらに参加する必要があります。

于 2012-11-08T08:58:53.803 に答える
0

ホストされたサーバーにコードをアップロードした後、IIS サーバーを再起動する必要があります

スタート メニュー > 実行 > iisreset

于 2012-11-08T09:10:26.910 に答える