C# 从存储过程刷新数据

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

我有一个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作业,然后通过调用数据库来监视日志。 也许服务经纪人可能是一个可以考虑的选择? 有没有想过我应该走哪条路来解决这类问题?
提前感谢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”完美地启动了该过程。@克莱夫,您还想查看其他信息吗?没有,这样做很好。非常感谢。如果你喜欢这个答案,请把这个答案的来源向上投票:谢谢!