C# 엔터티 프레임 워크 응용 프로그램이 있습니다. 코드에서 저장 프로 시저를 실행하려고합니다 (문제가 없습니다). 그것의 긴 실행, 약 30 분. 프로세스가 진행될 때 SQL 테이블에 각 트랜잭션의 로그를 작성합니다. 앱에서 프로 시저를 시작하려고하지만 로그에 마지막 10 개의 레코드가 10 초마다 다시 쿼리 될 수 있습니다. 진행 상황이 표시됩니다.저장 프로 시저의 데이터 새로 고침
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
Task.Run(() => _serviceProduct.RefreshAllAsync());
_cvsLog = (CollectionViewSource)(FindResource("cvsLog"));
var dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = TimeSpan.FromSeconds(10);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
_cvsLog.Source = _serviceProduct.GetRefreshLog();
}
나는 단순화하기 위해 코드를 변경했다. 스레드는 dispatcherTime_Tick 프로세스에서 차단됩니다. 저장 프로 시저가 괜찮아 보이는 것 같습니다.
다음은 호출 된 서비스입니다.
public ObservableCollection<RefreshLog> GetRefreshLog()
{
using (var db = new HiggidyPiesEntities())
{
var recs = (from x in db.RefreshLogs orderby x.LG_ID descending select x).Take(30);
var obs = new ObservableCollection<RefreshLog>(recs);
return obs;
}
}
백그라운드 작업자 경로와 task.run이 다운되었지만 프로 시저가 스레드를 계속 차단합니다.
나는 코드에서 SQL 작업을 시작한 다음 데이터베이스 호출을 통해 로그를 모니터링한다고 생각했습니다. 아마도 서비스 브로커가 고려해야 할 선택 일 수 있습니까?
어떤 유형의 문제와 관련하여 어떤 유형의 문제에 대해 생각해보십시오. 사전에 감사 스콧
DispatcherTimer를 사용해 볼 수 있습니다. 이것은 UI 스레드에서 실행된다는 점을 제외하고는 백그라운드 작업자처럼 작동합니다. 타이머가 10 초마다 ItemsSource를 새로 고칠 수 있습니다. –
감사합니다. 도움이 될지도 모른다. – scottsanpedro
당신의 UI 스택은 묻고 삭제 된 WPF 태그와 완전히 무관합니다. –