1

Xamarin Forms에서 스톱워치를 만들려고하고 있으며 기본 UI 스레딩 또는 Parallel Task Lib을 사용하여 시간 라벨을 지속적으로 업데이트해야하는지 궁금합니다. PT Lib을 사용하려고했지만 레이블을 업데이트 할 수 없기 때문에 기본 스레딩을 사용해야한다고 생각합니다.하지만 의존성을 사용하여 UI를 업데이트 할 수 있다면 걱정됩니다. 서비스. 지속적으로 UI를 업데이트하지만 버튼 클릭과 같은 다른 작업을 계속 수행 할 수있는 가장 좋은 방법은 있습니까?Parellel Task Library 대 UI Thread Xamarin.Forms UI를 지속적으로 업데이트 할 때

업데이트 : 아래에서이 코드를 사용해 보았지만 좋은 사례입니까? 나는 무릎 버튼을 누를 수있게 빙빙 돌리는 동안 끊임없이 시간 라벨을 업데이트 중이다.

Stopwatch sw = new StopWatch(); 
bool inRace = false; 
async void StartLapClick(object sender, System.EventArgs e) 
{ 

    if (!inRace) 
    { 
     inRace = true; 
     sw.Start(); 
     updateTimer(); 
    } 
} 

async void updateTimer() 
{ 

    await Task.Run(() => 
    { 
     while(inRace) 
     { 

      string slc = sw.Elapsed.ToString(); 
      Device.BeginInvokeOnMainThread(() => 
      { 
       timerLbl.Text = slc; 
      }); 
      Task.Delay(100).Wait(); 
     } 
    }); 
} 
+0

스톱워치에 필요한 해상도는 무엇입니까? 초 또는 초입니까? – ctacke

+0

@ctacke 시간을 분으로 표시합니다 : seconds.miliseconds –

답변

0

UI 스레드에서 UI를 업데이트해야합니다. 백그라운드에서 실행중인 타이머 또는 무언가를 주기적으로 실행하여 UI 스레드에 전달할 수 있습니다. 비록 당신이 그렇게했다하더라도, 나는 병렬 작업 라이브러리가 당신이 사용하고자하는 라이브러리라는 것을 모른다. 그것은 더 많은 작업을 병렬로 실행하는 데 더 중점을 둡니다.

+0

비동기로 작업하고 기능을 기다립니다. 이것이 최선의 관행일까요? –

+0

그래, 괜찮을 거에요.하지만 일반적으로 void를 반환하는 비동기 메서드를 만드는 것을 피해야합니다. 예를 들어 UpdateTimer() 내부에서 예외가 발생하면이를 catch 할 방법이 없습니다. –

+0

아주 좋은 점은 함수 내부의 오류에 대해서는 생각하지 않았다는 것입니다. 도와 주셔서 감사합니다! –

0

이 시도 :

Device.StartTimer(TimeSpan.FromSeconds(1.0),() => { 
    // Your code 
}; 
+0

고맙습니다.하지만 제 약속은 타이머를 시작하지 않았고 버튼을 클릭 할 수있는 동안 내 xaml의 타이머 라벨을 업데이트하고있었습니다. –

1

아니오, 코드합니다 (Best Practices in Asynchronous Programming에 따라) 몇 가지 문제가 있습니다

  • async void 나쁜 -이 당신의 메소드를 호출 화재 - 및 - 잊어 유행, 당신은 거기에서 과실을 얻을조차 수 없다. 간단한 타이머 전체 while 루프를 교체, 작업에 차단이

  • 에 대한 await를 사용하지 마십시오 - 당신은 updateTimer

  • Task.Delay(100).Wait();처럼 실제 방법 아니, StartLapClick 같은 이벤트 핸들러 그것을 단지를 사용한다 Task.Delay 전화 번호

  • updateTimer();을 제거하십시오. 이는 동기식으로 async 메서드를 호출하는 것으로 나쁘기도합니다.