DispatcherTimer가 24 일보다 긴 타이머를 설정하도록하려면 어떻게해야합니까?

날개를 가진 소행성

내 코드는 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.MaxValue2,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 빌드]

공원 토마토

문서화가 실패하면 오래된 소스 코드를 살펴 보겠습니다.

https://referencesource.microsoft.com/#windowsbase/Base/System/Windows/Threading/DispatcherTimer.cs,94

if (interval.TotalMilliseconds > Int32.MaxValue)
    throw new ArgumentOutOfRangeException("interval", SR.Get(SRID.TimeSpanPeriodOutOfRange_TooLarge));

당신의 관찰은 나에게 꽤나 예쁘게 보인다. 또한 Microsoft에 티켓을 제출하지 않고이 문서화되지 않은 동작을 변경할 수있는 좋은 방법이없는 것 같습니다.

왜 그들은 인위적으로 보이는 제한을 거기에 넣을까요? 이 선은 충분히 드러나는 것처럼 보입니다.

_dueTimeInTicks = Environment.TickCount + (int)_interval.TotalMilliseconds;

입력을 확인하고 티켓을 닫을 수 있는데 왜 코드를 리팩터링하여 코너 케이스를 처리합니까? :)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Python Tkinter에서 OptionMenu를 가장 긴 항목보다 짧은 고정 크기로 설정하려면 어떻게해야합니까?

분류에서Dev

데이터를 숨긴 후 보관하려면 어떻게해야합니까?

분류에서Dev

webView contentEditable = true로 설정해야하는데 키보드가 나타나지 않도록하려면 어떻게해야합니까?

분류에서Dev

JavaScript가 클립 보드를 수정하지 못하도록하려면 어떻게해야합니까?

분류에서Dev

ContentPlaceHolder에 긴 텍스트를 추가하려면 어떻게해야합니까?

분류에서Dev

`gnome-screensaver`가 키보드를 기본 레이아웃으로 재설정하지 못하도록하려면 어떻게해야합니까?

분류에서Dev

누군가 Azure에서 VIP 스왑을 수행 할 때 전자 메일을 보내도록 경고를 설정하려면 어떻게해야합니까?

분류에서Dev

문자보다 긴 것이 오류를 발생시키는 지 확인한 다음 사용자가 다시 시도하도록하려면 어떻게해야합니까?

분류에서Dev

긴 URL로 인해 테이블의 열 너비가 정렬되지 않도록하려면 어떻게해야합니까?

분류에서Dev

버퍼가 수정 된 후에 vim이 파일에만 쓰도록하려면 어떻게해야합니까?

분류에서Dev

목록의 이미지가 행과 타일에 나타나도록 코드를 수정하려면 어떻게해야합니까?

분류에서Dev

ReSharper가 .editorconfig 파일에 설정된 속성을 확인하도록 TeamCity를 구성하려면 어떻게해야합니까?

분류에서Dev

gdrive가 폴더를 압축 파일로 다운로드하도록하려면 어떻게해야합니까?

분류에서Dev

WAMP 서버의 다른 가상 호스트를 가리 키도록 여러 IP 주소를 설정하려면 어떻게해야합니까?

분류에서Dev

한 요소가 다른 요소를 다룹니다. 요소가 숨겨 지거나 / 가려 지거나 / 보이지 않도록 전면 / 위에 표시되도록 설정하려면 어떻게해야합니까?

분류에서Dev

bash의 특정 줄에 긴 텍스트를 추가하려면 어떻게해야합니까?

분류에서Dev

Ubuntu 18.10에서 창 테두리가 투명하게 보이도록하려면 어떻게해야합니까?

분류에서Dev

Safari가 스타일을 변경하지 못하도록하려면 어떻게해야합니까?

분류에서Dev

riak-js가 도보 객체를 반환하도록하려면 어떻게해야합니까?

분류에서Dev

내 div가 서로 일관된 높이를 유지하도록하려면 어떻게해야합니까?

분류에서Dev

이러한 컴퓨터가 폴더를 다시 공유하도록하려면 어떻게해야합니까?

분류에서Dev

긴 연결 끊김에도 불구하고 모든 데이터가 SSH 파이프로 전송되도록하려면 어떻게해야합니까?

분류에서Dev

객체 배열에서 가장 긴 이름을 찾은 다음 전체 객체를 javascript의 콘솔로 반환하려면 어떻게해야합니까?

분류에서Dev

ssh가 다른 키를 제공하지 못하도록하려면 어떻게해야합니까?

분류에서Dev

sudo가 내 환경 변수를 보존하도록하려면 어떻게해야합니까?

분류에서Dev

KDE가 인식하도록 환경 변수를 설정하려면 어떻게해야합니까?

분류에서Dev

IntelliJ가 * .txt 파일에서 매우 긴 줄을 줄 바꿈하도록하려면 어떻게해야합니까?

분류에서Dev

MTU가 9000이되도록 네트워크 브리지를 설정하려면 어떻게해야합니까?

분류에서Dev

목록을 반복하고 목록에서 정보를 가져 와서 파일의 별도 줄에 넣으려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    Python Tkinter에서 OptionMenu를 가장 긴 항목보다 짧은 고정 크기로 설정하려면 어떻게해야합니까?

  2. 2

    데이터를 숨긴 후 보관하려면 어떻게해야합니까?

  3. 3

    webView contentEditable = true로 설정해야하는데 키보드가 나타나지 않도록하려면 어떻게해야합니까?

  4. 4

    JavaScript가 클립 보드를 수정하지 못하도록하려면 어떻게해야합니까?

  5. 5

    ContentPlaceHolder에 긴 텍스트를 추가하려면 어떻게해야합니까?

  6. 6

    `gnome-screensaver`가 키보드를 기본 레이아웃으로 재설정하지 못하도록하려면 어떻게해야합니까?

  7. 7

    누군가 Azure에서 VIP 스왑을 수행 할 때 전자 메일을 보내도록 경고를 설정하려면 어떻게해야합니까?

  8. 8

    문자보다 긴 것이 오류를 발생시키는 지 확인한 다음 사용자가 다시 시도하도록하려면 어떻게해야합니까?

  9. 9

    긴 URL로 인해 테이블의 열 너비가 정렬되지 않도록하려면 어떻게해야합니까?

  10. 10

    버퍼가 수정 된 후에 vim이 파일에만 쓰도록하려면 어떻게해야합니까?

  11. 11

    목록의 이미지가 행과 타일에 나타나도록 코드를 수정하려면 어떻게해야합니까?

  12. 12

    ReSharper가 .editorconfig 파일에 설정된 속성을 확인하도록 TeamCity를 구성하려면 어떻게해야합니까?

  13. 13

    gdrive가 폴더를 압축 파일로 다운로드하도록하려면 어떻게해야합니까?

  14. 14

    WAMP 서버의 다른 가상 호스트를 가리 키도록 여러 IP 주소를 설정하려면 어떻게해야합니까?

  15. 15

    한 요소가 다른 요소를 다룹니다. 요소가 숨겨 지거나 / 가려 지거나 / 보이지 않도록 전면 / 위에 표시되도록 설정하려면 어떻게해야합니까?

  16. 16

    bash의 특정 줄에 긴 텍스트를 추가하려면 어떻게해야합니까?

  17. 17

    Ubuntu 18.10에서 창 테두리가 투명하게 보이도록하려면 어떻게해야합니까?

  18. 18

    Safari가 스타일을 변경하지 못하도록하려면 어떻게해야합니까?

  19. 19

    riak-js가 도보 객체를 반환하도록하려면 어떻게해야합니까?

  20. 20

    내 div가 서로 일관된 높이를 유지하도록하려면 어떻게해야합니까?

  21. 21

    이러한 컴퓨터가 폴더를 다시 공유하도록하려면 어떻게해야합니까?

  22. 22

    긴 연결 끊김에도 불구하고 모든 데이터가 SSH 파이프로 전송되도록하려면 어떻게해야합니까?

  23. 23

    객체 배열에서 가장 긴 이름을 찾은 다음 전체 객체를 javascript의 콘솔로 반환하려면 어떻게해야합니까?

  24. 24

    ssh가 다른 키를 제공하지 못하도록하려면 어떻게해야합니까?

  25. 25

    sudo가 내 환경 변수를 보존하도록하려면 어떻게해야합니까?

  26. 26

    KDE가 인식하도록 환경 변수를 설정하려면 어떻게해야합니까?

  27. 27

    IntelliJ가 * .txt 파일에서 매우 긴 줄을 줄 바꿈하도록하려면 어떻게해야합니까?

  28. 28

    MTU가 9000이되도록 네트워크 브리지를 설정하려면 어떻게해야합니까?

  29. 29

    목록을 반복하고 목록에서 정보를 가져 와서 파일의 별도 줄에 넣으려면 어떻게해야합니까?

뜨겁다태그

보관