문제

나는 a를 사용하고있다 DispatcherTimer 카메라에서 릴리스를 트리거하기 전에 카운트 다운을 수행합니다. 그만큼 UpdateCountdown 메소드는 카메라가 발사되기 전에 사용자에게 표시된 이미지를 변경하는 데 사용됩니다. 가지고있는 것보다 TakePicture 메소드가 즉시 실행되면 카운터가 0에 도달하고 마지막 이미지가 표시된 후 약간의 지연을 원합니다.

아래에 표시된 코드는 _countdown = 1 가리키다. 최종 이미지가 표시되는 동안 TakePicture() 거의 동시에 화재가 발생합니다 (생각합니다 TakePicture 먼저 발생합니다).

_countdownTimer = new DispatcherTimer();
_countdownTimer.Interval = TimeSpan.FromSeconds(1);
_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)
     { UpdateCountdown(); } );

_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)
     {if (_countdown == _countdownMax)
        {
            System.Threading.Thread.Sleep(2000);  // Slight delay before taking picture
            Camera.TakePicture();
        } });
    }

public void StartCountdown()
{
    if (doCount)
    {
        doCount = false;
        UpdateCountdown();
        _countdownTimer.Start();
    }
}

private void UpdateCountdown()
{
    _countdown--;
    CountdownImage = _countDownImages[_countdown]; // Data bound to Image Control

     if (_countdown == 0)
     {
       _countdown = _countdownMax;
       _countdownTimer.Stop();
       doCount = true;
      }

타이밍을 고려하지 않은 것은 무엇입니까?

도움이 되었습니까?

해결책

제어 속성을 변경할 때 UI는 즉시 업데이트되지 않습니다. 스레드가 유휴 상태가 될 때만 업데이트됩니다 (즉, 모든 이벤트 처리기가 실행 된 후).

Thread.sleep는 스레드를 차단하고 이벤트 처리기는 실행을 끝내지 않고 UI가 다시 그려지지 않습니다.

다른 타이머를 사용해야합니다 (기존 타이머의 마지막 진드기에서 새 타이머를 시작하고 Teh New Timer 's Tick에서 TakePicture를 호출하십시오). (_countdown <= _countdownMax), 언제 사진을 찍으십시오 (_countdown == _countdownMax + 1).

다른 팁

디스플레이가 항상 남은 초보다 1을 낮게 표시하게하지 않겠습니까? 그렇게하면 0에 도달하면 (-1을 표시하지 않기 위해 Math.max (0, _countdown)와 함께 1 초가 더 걸리더라도 시간이 다 떨어진 것처럼 보일 것입니다.

편집 : 내가 암시하지만 진술하지 않은 것은 하나 진드기 핸들러와 수면을 전혀 사용하지 않으면 UI를 차단하는 것만으로 UI가 업데이트되는 것을 막을 수 있습니다.

이벤트는 이벤트 처리기가 등록 된 순서대로 트리거된다고 보장한다고 생각하지 않습니다. 노력하다

_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)     
{
        UpdateCountdown();
        if (_countdown == _countdownMax)
        {
            System.Threading.Thread.Sleep(2000);  // Slight delay before taking picture
            Camera.TakePicture();
        }
      });
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top