2010-02-16 6 views
3

내 .net 도메인 개체 내 각 상태 전환을 추적하고 있습니다. 상태 집합을 상태 기록 컬렉션에 넣으면됩니다. 따라서 나중에 상태가 바뀐 에 어떤 시간에 바뀌 었는지 알기 위해 내림차순 목록을 볼 수 있습니다. 새로운 RequestStateHistoryItem 인스턴스화하면, 현재 날짜가 자동으로 할당됩니다.Net DateTime 정밀도

private void SetState(RequestState state) 
{ 
    var stateHistoryItem = new RequestStateHistoryItem(state, this); 

    stateHistoryItems.Add(stateHistoryItem); 
} 

:

그래서 이런 방법이있다. 이 같은

protected IdentificationRequestStateHistoryItem() 
{ 
    timestamp = EntityTimestamp.New(); 
} 

EntityTimestamp 객체는 사용자와 appropiate 만들어 변경된 일자를 포함하는 것을 목적으로한다.

상태 기록을 나열

, 나는 Linq에와 내림차순을 수행 새 Request 처음 상태 Received를 인스턴스화 지금

public virtual IEnumerable<RequestStateHistoryItem> StateHistoryItems 
{ 
    get { return stateHistoryItems.OrderByDescending(s => s.Timestamp.CreatedOn.Ticks); } 
} 

는 생성자 SetState(RequestState.Received)에 설정되어 있습니다. 그런 다음 지연없이 일부 조건에 따라 새 상태 Started이 설정됩니다. 잠시 후 (db 작업) 상태가 Finished으로 설정됩니다.

이제 내림차순 정렬을 수행 할 때 Received은 항상 Started 상태 이후입니다. 느리게 디버깅 할 때 또는 Started으로 상태를 설정하기 전에 System.Threading.Thread.Sleep(1000)을 넣을 때 순서가 작동합니다. 위의 이야기로 는 그렇지 않은 경우는 Started 상태의 CreatedOn는 Received CreatedOn 일 후 오래!

TimeOfDay {17:04:42.9430318} FINSHED 
Ticks 634019366829430318 

TimeOfDay {17:04:39.5376207} RECEICED 
Ticks 634019366795376207 

TimeOfDay {17:04:39.5367815} STARTED 
Ticks 634019366795367815 

어떻게 될 수 있습니까? 나는받은 경우 이해 및 날짜가 정확히 동일 시작,하지만 난 그것도 다른 하나는 전에 할 수있는 방법을 이해하지 못하는 것?

이미 다른 질문에서 찾은 new DateTimePrecise().Now, (DateTimePrecise class 참조)을 시도했습니다. 같은 결과.

누구나 그 사람이 무엇인지 알 수 있습니까?

업데이트

public virtual bool Finish() 
{ 
    // when I put the SetState(State.Received) from the constructor into here, the timestamp of finish still is BEFORE received 
    SetState(IdentificationRequestState.Received); 
    SetState(IdentificationRequestState.Finished);   

    // when I put the SetState(State.Received) after Finished, then the Received timestamp is BEFORE Finished 
    SetState(IdentificationRequestState.Finished);   
    SetState(IdentificationRequestState.Received); 

    var match = ... 

    if (match != null) 
    { 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 
+0

당신이 다중 스레드 환경에서 실행중인 : 당신이 엄격한 순서를 원하는 경우

, 당신은 동기화를 사용하는 당신은 역사 항목을 인스턴스화 할 때마다 다음과 같은 뭔가가 필요? Received 및 Started 상태가 다른 스레드에 의해 요청 된 경우 이는 표시되는 불일치를 설명합니다. –

답변

0

는 어떻게 Started에 맞게 즉, 생성자 밖으로 Received 스탬프를 이동 (동일한 접근 방식을 통해 ReceivedStarted 타임 스탬프를 모두 설정하고 속성 또는 메서드를 통해 설정을 시도 되세요 상태가 설정되어 있습니까?).

가 나는 이유를 설명하지 않습니다 알고 있지만 생성자는 런타임에서 다소 특별하다. .NET 생성자는 가능한 한 빨리 실행되도록 설계되었으므로 성능에 중점을 둘 수있는 몇 가지 부작용이 있다는 것은 놀랄 일이 아닙니다.

2

DateTime.Now는 밀리 초 단위로 정확하지 않습니다. 단지 (다만 방법 윈도우의 내부 시계가, IIRC 작동되는) 30 또는 15 밀리 초와 같은 큰 간격으로 뭔가를 업데이트됩니다.

System.Diagnostics.초시계은 시간을 측정하는 더 정확한 방법입니다 차이점. 또한 로컬 시간 변환에 대한 UTC의 오버 헤드가 없습니다. DateTimePrecise 클래스는 DateTime과 Stopwatch를 결합하여 DateTime.Now보다 더 정확한 시간을 제공합니다.

+0

DateTime.Now보다 시간을 기록하는 데 더 정확한 방법이 있지만 사실 여기서 문제가되지는 않습니다. 내 대답을 보라. – Joe

2

에서 시간 소인을 검색하고 있습니다. 전에 컬렉션에 추가하십시오.

컬렉션을 검색하여 컬렉션에 추가하는 것 사이의 지연은 가변적입니다. 예를 들어, 타임 스탬프를 얻은 후 컬렉션에 추가하기 전에 스레드가 스케줄러에 의해 선점 될 수 있습니다.

lock(syncLock) 
{ 
    // Timestamp is generated here... 
    var stateHistoryItem = new RequestStateHistoryItem(state, this); 
    // ... but an indeterminate time can pass before ... 
    ... 
    // ... it's added to the collection here. 
    stateHistoryItems.Add(stateHistoryItem); 
} 
+0

나는 그것을 시도했지만 도움이되지 않았다 ...하지만 어쨌든 고마워. – Chris