c# 每 x 秒运行一次数据库任务

Posted

技术标签:

【中文标题】c# 每 x 秒运行一次数据库任务【英文标题】:c# run a database task every x seconds 【发布时间】:2019-03-09 04:51:40 【问题描述】:

我想运行一个任务来查询数据库以获取用户的新消息。 我希望任务每隔 x 秒运行一次,以新的方式运行,这样它就不会导致 UI 变得无响应。 如果数据库任务找到消息,那么我希望它使这些消息可用于 UI。

我认为整个循环会在它自己的线程中运行,而不是在 UI 线程中有一个循环,它会每隔 x 秒创建一个新线程。我认为这会停止对数据库的多次调用,例如如果我将查找设置为每 5 秒一次,并且数据库的响应时间超过 5 秒。 我一直在寻找好几个小时 - 我发现的最好的文章是: https://blogs.msdn.microsoft.com/benwilli/2016/06/30/asynchronous-infinite-loops-instead-of-timers/

我是线程新手,上面的链接在最后一个示例 DoWorkAsyncInfiniteLoop 中似乎相对简单,但它似乎在 UI 线程上运行(尽管它提到您可以使用 Task.Run 使其在自己的线程中运行,而且我不确定 UI 线程如何使用找到的消息。

任何建议将不胜感激!

【问题讨论】:

你试过什么?你的代码呢? 如上所述,在我剪切任何代码之前,我已经研究了各种选项。认为我将在单独的线程和调度程序上使用无限循环以获取结果。 【参考方案1】:

使用 SQLDependency,您将不再需要添加无限循环。见以下链接:

SQLDependency Using C#

通过在 WindowsForm 中使用新线程,您无法直接访问 UI 元素,因为它们位于您的主线程中。在这种情况下你必须使用 Dispatchers,这里有一个解释:

Access UI Element From Another Thread

【讨论】:

看起来不错 - 我正在使用 oracle,但会寻找等效的。我想我现在正在理解 Dispatcher,所以我想我将继续运行无限循环并使用调度程序来获取结果。【参考方案2】:

OK 有一些小困难 - 不能使用调度程序,因为我正在使用 MVVM,并且视图模型没有调度程序,因为它不是从 UI 基础派生的。这是我的最终代码,供其他人尝试实现此目标

 public MainViewModel()  //the constructor for the viewmodel
    
        _Repo = CurrentApp.MainController.RepositoryManager; // this is my database access methods

        Task t = Task.Run(CheckMessagesAsyncInfiniteLoop);  //run the new thread
    


    private async Task CheckMessagesAsyncInfiniteLoop()  //this is my infinite loop as described in the above link, but run from the above Task.Run
    
        while (true)
        
            // Check the messages in the database
             Messages = _Repo.Service_Message_GetList(CurrentApp.CurrentUser.BasicInfo.UserID);

            // pause for the next check
            await Task.Delay(30000);
        
    

    Repository.DomainLayer.MessageCollection _Messages;  //the collection that will be updated by the thread above
    public Repository.DomainLayer.MessageCollection Messages  //the property that my view is bound to
    
        get
        
            return _Messages;
        
        set
        
            _Messages = value;
            NotifyPropertyChanged();
        
    

【讨论】:

以上是关于c# 每 x 秒运行一次数据库任务的主要内容,如果未能解决你的问题,请参考以下文章

两个任务之间的 X 秒延迟 c#

如何每 X 秒运行一次方法

我怎样才能让我的 caroutine 每 x 秒运行一次

Xamarin Forms:即使应用程序在后台,如何每 x 秒运行一次服务?

每15分钟重复一次函数c# [关闭]

C# 要想给一个死循环设置循环时间间隔,每5秒循环一次。