从另一个不工作的线程调用存储过程 c#, EntityFramework

Posted

技术标签:

【中文标题】从另一个不工作的线程调用存储过程 c#, EntityFramework【英文标题】:Invoke stored procedure from another thread not working c#, EntityFramework 【发布时间】:2021-10-31 15:06:25 【问题描述】:

我有一个存储过程来清理一些数据。

当我从 Program.cs 调用时,就像跟随它不起作用

    static void Main(string[] args)
    
      LogCleaner logCleaner = new LogCleaner(appConfiguration);
      Task.Run(() => logCleaner.Start());
    

LogCleaner.Start 函数如下

        try
        
            using(UnitOfWork unitOfWork = new UnitOfWork(this.appConfiguration.DefaultConnectionString))
            
                var result = unitOfWork.E3DLogs.CleanUpLogs(this.appConfiguration.CleanUpDayCount);
                logger.Info("Clean up stored procedure executed, Result: " + result.ToString());
            
        
        catch (Exception e)
        
            logger.Error("Error while cleaning the log messages. Error Message: " + e.Message);
        

unitOfWork.E3DLogs.CleanUpLogs 如下

    public int CleanUpLogs(int dayCount)
    
        return _E3DDbcontext.CleanUpLogs(dayCount);
    

_E3DDbcontext.CleanUpLogs 函数如下

    public virtual int CleanUpLogs(Nullable<int> dayCount)
    
        var dayCountParameter = dayCount.HasValue ?
            new ObjectParameter("dayCount", dayCount) :
            new ObjectParameter("dayCount", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CleanUpLogs", dayCountParameter);
    

当我从 Program.cs 调用时,就像跟随它的工作一样

    static void Main(string[] args)
    
      LogCleaner logCleaner = new LogCleaner(appConfiguration);
      logCleaner.Start();
    

【问题讨论】:

你永远不会等待你在 task.run() 中创建的任务。会不会是程序退出的速度快于任务的执行速度? 请定义“它不工作” - 实际上发生了什么 【参考方案1】:

一个进程(exe)在最后一个非后台线程终止时退出,对于简单的应用程序意味着:当Main退出时。为Task.Run 提供服务的线程池使用background 线程,因此它们不计入应用程序生命周期。

直接运行代码可以防止这种情况发生。或者,您可以这样做(如果相关):

static Task Main(string[] args)

    LogCleaner logCleaner = new LogCleaner(appConfiguration);
    var logCleaner = Task.Run(() => logCleaner.Start());

    // presumably some other code to run here, because if there wasn't:
    // you'd just run logCleaner.Start() directly

    return logCleaner; // include the log-cleaner in the application lifetime

【讨论】:

await logCleaner;Main 异步不是更有意义吗 @Charlieface 如果您在Main 中还有其他异步事情要做,那么这是有道理的;没有必要 await 它,否则 - 可以返回它并让调用者担心

以上是关于从另一个不工作的线程调用存储过程 c#, EntityFramework的主要内容,如果未能解决你的问题,请参考以下文章

从另一个存储过程 oracle 调用存储过程

MySQL 从另一个存储过程调用存储过程

在 Oracle 中从另一个存储过程调用一个存储过程

从另一个存储过程调用具有交叉应用的存储过程会产生错误 SQL 服务器

从另一个存储过程调用的存储过程中获取第一个结果集

如何传递逗号分隔的输入参数以从另一个存储过程调用存储过程