1

以下に、私の最新のコーディングの心痛の原因を示します。これは、セカンダリスレッドで派生クラスのメソッドを実行する基本クラスの小さなメソッドです。このコードは、5分ごとに開始されるWindowsサービスで約5回実行されます。

Private Sub performAction(ByVal startedAt As DateTime)
    Dim waiter As New System.Threading.AutoResetEvent(False)
    Try
        Dim statusTimeout As Short = DefaultTimeOutSeconds
        Dim action As Threading.Thread = New Threading.Thread(AddressOf ActionToPerform)
        Dim configHelper As New ApplicationHelper.SST_CONFIG()
        Short.TryParse(configHelper.GetConfig(String.Format("{0}.Timeout", ActorType), DefaultTimeOutSeconds), statusTimeout)
        action.SetApartmentState(System.Threading.ApartmentState.STA)
        action.Priority = Threading.ThreadPriority.Highest
        action.Start()
        While LastUpdated < startedAt AndAlso DateTime.Now <= startedAt.AddSeconds(statusTimeout)
            waiter.WaitOne(1000)
        End While
    Finally
        waiter.Close()
    End Try
End Sub

しばらくの間は正常に動作します。最終的にはメモリが不足します。その時点から、サービスが再起動されるまでメモリエラーがスローされます。実際にスローされたエラーのテキストは次のとおりです。

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout)
at DeviceManagement.AsynchronousDeviceAction.performAction(Thread& action, DateTime startedAt)
at DeviceManagement.AsynchronousDeviceAction.Perform()
at DeviceManagement.PAJournalPrinter.GetStatus();

AutoResetEventを使用してwhileループを制御し始めるまで、これらのエラーは実際には発生し始めませんでした。私はSystem.Threading.Thread.Sleepを使用していました。ただし、sleepメソッドを使用した場合、呼び出すcomオブジェクトの1つは実行されませんでした。AutoResetEventに変更すると、そのコードが実行されますが、comオブジェクトを呼び出すメソッドが、実行する派生クラスの1つでなくても、メモリエラーが表示されるようになりました。

助けてください。:)

4

1 に答える 1

0

system.threading.thread.sleepに戻ると、問題が解決しました。AutoResetEventが機能する必要があるデバイスのみがAutoResetEventを使用しています。記憶の誤りは消え去りました。

于 2013-03-18T15:46:35.633 に答える