刷新存储过程中的数据

我有ac#entity framework应用程序。 我试图从代码运行存储过程(没有问题)。 它长时间运行,大约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 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(recs); return obs; } } 

我一直在后台工作线路和task.run,但程序一直阻塞线程。

我甚至想过从代码中启动一个SQL作业,然后通过调用数据库来监视日志。 也许服务经纪人可能会考虑选择?

关于这类问题我应该走哪条道路的想法? 在此先感谢斯科特

鉴于此数据的性质只是用户的状态,做READ UNCOMMITTED似乎很好。 您可以尝试这两个选项,这两个选项看起来相当简单:

首先要尝试设置Session / Connection属性:

 public ObservableCollection GetRefreshLog() { using (var db = new HiggidyPiesEntities()) { db.context.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); var recs = (from x in db.RefreshLogs orderby x.LG_ID descending select x).Take(30); var obs = new ObservableCollection(recs); return obs; } } 

要尝试的第二件事是通过EF设置事务隔离级别:

 public ObservableCollection GetRefreshLog() { using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { ObservableCollection obs; using (var db = new HiggidyPiesEntities()) { var recs = (from x in db.RefreshLogs orderby x.LG_ID descending select x).Take(30); obs = new ObservableCollection(recs); } scope.Complete(); return obs; } } 

这两个想法都来自这个问题的各种答案: 与NOLOCK的entity framework 。 第一个基于Frank.Germain答案的建议,第二个基于Alexandre的答案。

只是让它作为一个选项提到,您可能想要查看SQL Server 2005中引入的SNAPSHOT ISOLATIONfunction:

  • SQL Server中的快照隔离
  • ALTER DATABASE SET选项 (搜索字符串“snapshot_is”)

如果您使用的是EF 6.0和.NET 4.5,则应尝试使用最新function和acync支持: entity framework6异步查询 , EF中基于任务的异步模式支持看起来该function的设计完全符合您的类似问题。

您可以将它与@ user2002076建议的DispatcherTimer结合使用。

要每x秒读取一次进度,您可以开发另一个存储过程,在里面可以使用READ UNCOMMITTED提示SQL。

显然所有这些都需要EF 6.0和.NET 4.5,但实现起来会很好而且简短。