2013-03-05 6 views
1

iPhone 용 모노 터치에 비교적 작은 프로젝트가 있습니다. & Android with WP7을 추가 할 계획입니다. SQLite에 ORM으로 vici coolstorage를 사용하고 있는데 문제가되지 않지만 문제가 하나 있습니다. db를 사용하여 스레드 당 추가 스레드를 작성합니다. 응용 프로그램이 대규모 병렬이므로 이미 스레드 한계에 도달했습니다. 그래서이를 변경하려고합니다. 제가 서로 다른 스레드로부터 GetDB 각 통화가 새로운 스레드가 생성된다 스레드가 생성 CSConfig.cs 행한다 발견 :Vici coolstorage 추가 스레드

internal static CSDataProvider GetDB(string strContext) 
    { 
     if (_threadData == null) 
      _threadData = new ThreadData(); 

     return _threadData.GetDB(strContext); 
    } 

_threadData[ThreadStatic]가 표시된다. 이 GetDB는 ORM을 사용할 때마다 호출됩니다 (CSConfig에서 기본 DB를 내 DB로 설정). 스레드는 ThreadData 생성자 안에 생성됩니다. 스레드는이 함수를 실행합니다.

 private void CleanupBehind() 
     { 
      _callingThread.Join(); 

      foreach (CSDataProvider db in _threadDbMap.Values) 
       db.Dispose(); 
     } 

따라서 본질적으로 호출자가 종료 될 때까지 기다린 다음 데이터베이스 연결을 삭제합니다.

질문은 어떻게하면이 동작을 무시할 수 있으며 호출 스레드가 종료되기 전에 GC가 데이터베이스 연결을 처리하도록하거나 Dispose()을 호출하게 할 수 있습니다 (DB를 사용하는 모든 스레드를 제어하므로 수행 할 수 있습니다). 스레드가 끝날 때 ORM이 연결 해제를 처리하지 못하게하는 것이 좋지 않지만 작업자 스레드 당 하나의 추가 스레드로는 작업 할 수 없습니다.

+0

매우 흥미로운 질문입니다. 나는 나중에 약간의 피드백과 함께 되돌아 올 것이다. –

답변

0

오케이 나 자신의 질문에 대답하는 것이 나쁘다는 것을 알고 있습니다. 어쩌면 누군가를 도울 수 있습니다. 정리를위한 함수를 CSConfig에 추가하는 해결 방법을 수행했습니다. 데이터베이스를 사용하는 모든 스레드가 종료되기 전에 스레드 작성을 모두 제거하고 정리를 호출합니다. 따라서 여분의 스레드가 없습니다.

문제가 발생했습니다. 주로 스레드가 네트워크 작업 내에있을 때 일부 경우 강제 스레드 종료를 사용합니다. 그래서 때때로 모든 데이터베이스 연결을 반복하고 죽은 스레드에 속한 것을 제거해야합니다.

그러나 결국 거의 두 번 적은 스레드가 있습니다.