Visual Studio 2010でVB.NET Webサイトを作成しています。このプロジェクトは、IIS 7のローカルインスタンスでWebサイトを実行するように設定されています。 http://localhost/mywebsite、ウェブサイトは正常に実行され、プロセスw3wp.exeは予想どおりCPU使用率が約2〜3%上昇します。 Visual StudioでWebサイトのビルドを実行すると、w3wp.exeプロセスは最大25%のCPU使用率にジャンプし、IEに移動してWebサイトをテストするとそこにとどまります。私が再びビルドすると、w3wp.exeプロセスは約50%のCPU使用率にジャンプします。IEに再び戻ってウェブサイトをテストすると、そこにとどまります。このプロセスは、CPU使用率が90〜100%に達するまで続きます.W3wp.exeプロセスを強制終了して、Webサイトを再起動する必要があります。Visual Studio 2010 - Webサイト作成後のCPU使用率が高くなる
これが起こっている理由と解決方法を知っている人は誰ですか?これは、Visual StudioでIISが使用しようとしているDLLを上書きすることと関係があると想定しています。ポストビルドタスクにアプリケーションプールリセットコマンドを追加するのが最善でしょうか?
私はIIS ExpressまたはVisual Studio Development Serverを実行できるとは認めていますが、フルバージョンのIIS 7を使用して本番環境と同じテスト環境を使用していることを確認することをお勧めします。
何か助けていただきありがとうございます。
編集 私はこの問題を絞り込んだ。私は、JeremyがApplication_Startで動作していることについて以下で尋ねたところで、問題はアプリケーション開始時のコードの結果であることを知りました。いくつかの静的コレクションにデータをロードするコードをコメントアウトすると、CPUの再構築時にスパイクが発生しません。だから、それをベースにして、なぜ私はCPUをスパイクするいくつかのコードに基づいてデータを静的なコレクションをロードするプロジェクトを再構築するか知っていますか?
これは私がデータと静的オブジェクトをロードするためにやっているものの例である:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
MyObjects.Load(connectionString)
End Sub
Public Class MyObjects
Private Shared _objects As Dictionary(Of String, Dictionary(Of String, MyObject)) = Nothing
Private Shared _lockObject As New Object
Private Shared _connectionString As String = Nothing
Shared Sub New()
End Sub
Shared Sub Load(ByVal s As String)
Dim qry As StringBuilder = Nothing
Dim dt As DataTable = Nothing
Dim tempDefHolder As Dictionary(Of String, Dictionary(Of String, MyObject)) = Nothing
qry = New StringBuilder()
qry.AppendLine("my query")
_connectionString = s
dt = New DataTable()
Using conn As New OracleConnection(_connectionString)
Using cmd As New OracleCommand(qry.ToString(), conn)
Using da As New OracleDataAdapter(cmd)
conn.Open()
da.Fill(dt)
End Using
End Using
End Using
tempDefHolder = LoadMyObjectsFromDataTable(dt) '(turns datatable into dictionary of objects
'assign _objects using synclock
SyncLock _lockObject
_objects= tempDefHolder
End SyncLock
End Sub
End Class
別の編集 現在アプリはIIS 7で64ビットとして実行するように設定されているが、それがコンパイルされます「Any CPU」の場合IISのアプリケーションプールを「32ビットアプリケーションを有効にする」に変更して32ビットモードで実行すると、アプリケーションが64ビットモードで実行されているときと同じように再構築するとCPUスパイクは発生しません。
これは、アプリケーションコード内にある可能性があります。デバッグをやめてブラウザウィンドウをシャットダウンしても、開始されたリクエストは停止されません。あなたのglobal.asaxに普通のことはありませんか? –
私は実際にデバッグモードに入ることはありません。私はIIS 7のローカルインスタンスに対して実行しているので、決して停止しません。私はいくつかの静的オブジェクトをglobal.asaxにロードします。これらのオブジェクトをロードしているコードが間違いなく100%保証されているとは言えませんが、それは問題ではないと思います。上で述べたように、コードが初めて実行されるとき、それは正常に動作し、CPUを増強するのは追加のビルドだけです。 –