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

时间:2018-10-03 21:17:23

标签: c# multithreading timer

我想运行一个任务,该任务在数据库中查询用户的新消息。 我希望任务以新的步伐每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线程。

任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

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

SQLDependency Using C#

通过在WindowsForm中使用新线程,您将无法直接访问UI元素,因为它们位于您的主线程中。在这种情况下,您必须使用Dispatchers,这是有关它的说明:

Access UI Element From Another Thread

答案 1 :(得分:0)

确定有一些小困难-无法使用调度程序,因为我正在使用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();
        }
    }