이 코드에 메시지를 전달하는 관찰 가능한 타이머를 필요 :는 UI 스레드에서 호출 UI 스레드
public void ShowProgress(Action<long> notify, Action terminate)
{
this.Progress = Observable.Timer(ProgressInterval, ProgressInterval).Finally(terminate).Subscribe(notify);
}
블록 UI 스레드 완전히는 응답 만들기 : ShowProgress가하는
Jobs.Current.ShowProgress(_ =>
{
if (Jobs.Current.Duration == 0 && this.progressBarMarkJob.Value >= this.progressBarMarkJob.Maximum - this.progressBarMarkJob.Step/2)
{
this.progressBarMarkJob.Step /= 2;
}
this.progressBarMarkJob.PerformStep();
},() =>
{
stopwatch.Stop();
var elapsed = string.Format(stopwatch.Elapsed.TotalHours >= 1 ? @"{0:hh\:mm\:SS}" : @"{0:mm\:SS}", stopwatch.Elapsed);
this.labelMarkTime.Text = string.Format("Elapsed{0:8}", elapsed);
this.labelMarkTime.Visible = true;
Jobs.Current.Duration = (uint)stopwatch.Elapsed.TotalSeconds;
this.progressBarMarkJob.Value = this.progressBarMarkJob.Maximum;
});
.
Subscribe() 호출 전에 .SubscribeOn (Scheduler.CurrentThread)을 삽입하면 더 이상 UI 스레드가 차단되지 않습니다. 그러나 메시지가 올바른 스레드의 UI로 전달되지 않기 때문에 교차 스레드 예외가 발생합니다.
타이머에서 업데이트를 가져올 수 있도록 UI가 응답하도록 - UI 스레드에 다시 게시되도록 작업 할 수있는 방법이 있습니까?
분명히 UI와 다른 스레드에 가입 한 다음 호출을 실행하여 진행률 표시 줄을 Dispatcher를 통해 UI 스레드로 업데이트하십시오. 필요한 모든 정보를 가지고 있습니다. 왜이 문제가 발생하는지 확신 할 수 없습니다. 배경 => UI 호출 무술은 언덕만큼 오래되었고 여기에 주제를 다루는 데 대한 많은 질문이 있습니다. – Will
감사합니다. 윌, 고맙습니다.하지만 많은 검색 후에도 그 답변을 찾을 수는 없으며, 나에게 분명하지 않습니다. 어때? 특히 설명서에서 Dispatcher를 사용하라고 알려주지 만 코드를 작성할 때 컴파일러는 해당 옵션을 시도 할 때 오류를 표시합니다. – shipr