2011-07-07 6 views
1

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スパイクは発生しません。

+0

これは、アプリケーションコード内にある可能性があります。デバッグをやめてブラウザウィンドウをシャットダウンしても、開始されたリクエストは停止されません。あなたのglobal.asaxに普通のことはありませんか? –

+0

私は実際にデバッグモードに入ることはありません。私はIIS 7のローカルインスタンスに対して実行しているので、決して停止しません。私はいくつかの静的オブジェクトをglobal.asaxにロードします。これらのオブジェクトをロードしているコードが間違いなく100%保証されているとは言えませんが、それは問題ではないと思います。上で述べたように、コードが初めて実行されるとき、それは正常に動作し、CPUを増強するのは追加のビルドだけです。 –

答えて

1

多くの無駄な時間の後にこれを理解しようとしています。私は64ビットODP.net dllの私のバージョンに問題を絞り込んだ。私はちょうどOracleのサイトに行って、ODP.netへの最新のアップデートをダウンロードしました。問題は修正されています。私のバージョンと最新のバージョンの間のどこかに修正されたコードのバグだったはずです。

関連する問題