我有一个 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 作业,然后通过调用数据库来监视日志。
也许服务经纪人可能是一个值得考虑的选择?
对于此类问题我应该走哪条路?
预先感谢斯科特
鉴于此数据的性质只是用户的一种状态,因此 READ UNCOMMITTED 似乎没问题。您可以尝试这两个选项,这两个选项看起来都相当简单:
首先要尝试的是设置会话/连接属性:
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 功能:
- SQL Server 中的快照隔离
-
更改数据库设置选项(搜索字符串“snapshot_is”)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)