C# 从存储过程刷新数据
我有一个c实体框架应用程序。 我正在尝试从代码运行存储过程,没有问题。它运行时间很长,大约30分钟。在处理过程中,我将每个事务的日志写入SQL表。 我希望从应用程序启动该过程,但随后显示登录屏幕的最后10条记录,可能每10秒重新查询一次。这将显示出进展C# 从存储过程刷新数据,c#,sql,entity-framework,sql-server-2008-r2,C#,Sql,Entity Framework,Sql Server 2008 R2,我有一个c实体框架应用程序。 我正在尝试从代码运行存储过程,没有问题。它运行时间很长,大约30分钟。在处理过程中,我将每个事务的日志写入SQL表。 我希望从应用程序启动该过程,但随后显示登录屏幕的最后10条记录,可能每10秒重新查询一次。这将显示出进展 private void Window_Loaded_1(object sender, RoutedEventArgs e) { Task.Run(() => _serviceProduct.RefreshAllA
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作业,然后通过调用数据库来监视日志。
也许服务经纪人可能是一个可以考虑的选择?
有没有想过我应该走哪条路来解决这类问题?
提前感谢Scott如果您正在使用EF 6.0和.NET 4.5,您应该尝试使用最新的功能和acync支持:, 看起来该功能正是针对您的和类似的问题而设计的 您可以将其与@user2002076建议的Dispatchermer结合使用 要每x秒读取一次进度,您可以开发另一个存储过程,并在存储过程中使用readuncommitted提示SQL
显然,所有这些都需要EF 6.0和.NET 4.5,但实现将非常简单。鉴于此数据的性质只是用户的一种状态,因此执行“未提交的读取”似乎不错。您可以尝试以下两个选项,这两个选项看起来都非常简单: 首先尝试设置会话/连接属性:
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;
}
}
这两种观点都来自于对这个问题的不同回答:。第一个建议基于弗兰克。杰曼的答案,第二个建议基于亚历山大的答案
作为一个选项,您可能需要了解SQL Server 2005中引入的快照隔离功能:
搜索字符串snapshot_是
你可以试试调度员。除了在UI线程上运行外,它的工作方式类似于后台工作程序。您的计时器大约每10秒刷新一次您的项目资源。谢谢。这可能很有帮助。您的UI堆栈与所问问题完全无关,已删除WPF标记。现在可以停止吗?请稍候?您可以使用SqlDependency。您有SQL Server的Witch版本吗?第一部分使用“设置事务隔离级别READ UNCOMMITTED”完美地启动了该过程。@克莱夫,您还想查看其他信息吗?没有,这样做很好。非常感谢。如果你喜欢这个答案,请把这个答案的来源向上投票:谢谢!