내 코드는 System.Windows.Threading.DispatcherTimer
타이머를 설정하는 데 사용 됩니다.
어느 날 평소보다 더 큰 타이머를 설정하려고했고 다음과 같은 결과를 얻었습니다 ArgumentOutOfRangeException
.
System.ArgumentOutOfRangeException: TimeSpan period must be less than or equal to Int32.MaxValue.
그러나 .NET에서 사용하는 100ns 단위 ( "틱") TimeSpan
에서도 내 값 (대략 41 일 및 15½ 시간 또는 3,598,196,944ms 또는 3.5981969e + 13 틱 — 당연히 많은 틱)이 좋을 것입니다. 64 비트 정수 범위 내에서 TimeSpan
내부적으로 사용 하는 문서가 주장하는 내용입니다 (그리고 TimeSpan
생성자가 틱을 취하는 데 사용됨 ).
Int32.MaxValue
2,147,483,647 이므로 DispatcherTimer
최대 거의 25 일의 기간 만 지원 하는 것이 좋습니다 . 그러나 DispatcherTimer
문서에는이 제한이 언급되어 있지 않습니다.
몇 가지 테스트를 실행했으며 실제로 :
#include <cstdint>
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Threading;
void tick(System::Object^ sender, System::EventArgs^ args) {}
int main()
{
// Duration is in 100ns units (10m per second).
const TimeSpan delay1(2147483647ULL * 10000);
const TimeSpan delay2(2147483648ULL * 10000);
// Fine
DispatcherTimer^ timer1 = gcnew DispatcherTimer(
delay1,
DispatcherPriority::Normal,
gcnew EventHandler(&tick),
Dispatcher::CurrentDispatcher
);
// System.ArgumentOutOfRangeException
DispatcherTimer^ timer2 = gcnew DispatcherTimer(
delay2,
DispatcherPriority::Normal,
gcnew EventHandler(&tick),
Dispatcher::CurrentDispatcher
);
}
내 말은, 좋습니다. 순차적으로 더 짧은 지연 (예 : 한 번에 최대 하루)을 설정하여 문제를 해결할 수 있지만 가능하면 복잡성을 피하고 싶습니다.
내 관찰이 정확합니까? 그렇다면이 문서화되지 않은 동작을 변경할 수있는 방법이 있습니까?
[Windows 10 (v1803), Visual Studio 2019 (v16.4.5), .NET 4.7.03056, x64 빌드]
문서화가 실패하면 오래된 소스 코드를 살펴 보겠습니다.
if (interval.TotalMilliseconds > Int32.MaxValue)
throw new ArgumentOutOfRangeException("interval", SR.Get(SRID.TimeSpanPeriodOutOfRange_TooLarge));
당신의 관찰은 나에게 꽤나 예쁘게 보인다. 또한 Microsoft에 티켓을 제출하지 않고이 문서화되지 않은 동작을 변경할 수있는 좋은 방법이없는 것 같습니다.
왜 그들은 인위적으로 보이는 제한을 거기에 넣을까요? 이 선은 충분히 드러나는 것처럼 보입니다.
_dueTimeInTicks = Environment.TickCount + (int)_interval.TotalMilliseconds;
입력을 확인하고 티켓을 닫을 수 있는데 왜 코드를 리팩터링하여 코너 케이스를 처리합니까? :)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다