我有一个ac#实体框架应用程序。我正在尝试从代码运行存储过程(没有问题)。它长期运行,大约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作业,然后在此之后通过调用数据库来监视日志。也许服务经纪人可能是一个考虑的选择?
对这种类型的问题我应该走什么路有什么想法?预先感谢斯科特
鉴于此数据的性质只是用户的一种状态,因此执行“读未提交”似乎很好。您可以尝试以下两个选项,这两个选项似乎都非常简单:
要尝试的第一件事是设置会话/连接属性:
public ObservableCollection<RefreshLog> 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<RefreshLog>(recs); return obs; } }
要尝试的第二件事是通过EF设置事务隔离级别:
public ObservableCollection<RefreshLog> GetRefreshLog() { using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { ObservableCollection<RefreshLog> 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<RefreshLog>(recs); } scope.Complete(); return obs; } }
这两个想法都来自有关此问题的各种答案:带NOLOCK的实体框架。第一个建议基于Frank.Germain的答案,第二个建议基于Alexandre的答案。
并且只是要提到它作为一种选择,您可能想要研究一下SQL Server 2005中引入的SNAPSHOT ISOLATION功能: