gpt4 book ai didi

c# - 从存储过程刷新数据

转载 作者:行者123 更新时间:2023-12-02 14:06:20 24 4
gpt4 key购买 nike

我有一个 C# 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<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 似乎没问题。您可以尝试这两个选项,这两个选项看起来都相当简单:

首先要尝试的是设置 session /连接属性:

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;
}

}

这两个想法都取自有关此问题的各种答案:Entity Framework with NOLOCK 。第一个建议基于 Frank.Germain 的答案,第二个建议基于 Alexandre 的答案。

为了将其作为一个选项提及,您可能需要研究一下 SQL Server 2005 中引入的 SNAPSHOT ISOLATION 功能:

关于c# - 从存储过程刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26615535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com