C # таймер для циклического опроса базы данных - PullRequest
4 голосов
/ 06 января 2010

Я пока не очень знаком с C #, по крайней мере, недостаточно, чтобы чувствовать себя уверенно при выборе способов сделать что-то, когда это происходит впервые.

Как лучше всего организовать опрос на основе таймера базы данных SQL Server из моего приложения WPF для обновления элементов управления?

Не могли бы вы поделиться некоторыми мыслями по этому вопросу или, может быть, примерами кода, как это может быть реализовано? Насколько короткий (или разумный) срок проведения такого опроса? Что может быть опасно делать?

Может быть, есть один стандартный и правильный способ сделать это?

Ответы [ 3 ]

4 голосов
/ 06 января 2010

Вы можете использовать объект SqlDependency , хотя это очень тесно связывает вашу реализацию с SQL Server 2005 +.

2 голосов
/ 06 января 2010

Если вам нужно обновление для всего приложения, и оно не вызовет слишком большой задержки для обновления, лучший вариант - запустить фон Thread, который может запускаться и публиковать события для подписчиков, которые имеют данные был обновлен (возможно, сначала проверьте, не было ли оно изменено с использованием определенной логики, добавив к событию пользовательский EventArgs).

Например, создайте экземпляр этого класса где-нибудь верхнего уровня (возможно, ваш основной код формы?):

using System;
using System.Threading;
using System.Windows.Forms;

public class PollerThread
{
    private Thread _thread;
    private SynchronizationContext _syncContext;

    public event EventHandler UpdateFinished;

    public PollerThread()
    {
        _syncContext = WindowsFormsSynchronizationContext.Current;

        ThreadStart threadStart = new ThreadStart(ThreadStartMethod);
        _thread = new Thread(threadStart);
        _thread.Name = "UpdateThread";
        _thread.IsBackground = true;
        _thread.Priority = System.Threading.ThreadPriority.Normal;
    }

    public void Start()
    {
        if ((_thread.ThreadState & ThreadState.Unstarted) == ThreadState.Unstarted)
            _thread.Start();
        else
            throw new Exception("Thread has already been started and may have completed already.");
    }

    public void ThreadStartMethod()
    {
        try
        {
            while (true)
            {
                // Go get the new data from the SQL server

                OnUpdateFinished(); // Notify all subscribers (on their own threads)
                Thread.Sleep(10000); // 10 sec wait before the next update
            }
        }
        catch (ThreadAbortException)
        {
            // The thread was aborted... ignore this exception if it's safe to do so
        }
    }

    protected virtual void OnUpdateFinished()
    {
        if (UpdateFinished != null)
        {
            SendOrPostCallback method = new SendOrPostCallback(
            delegate(object state)
            {
                UpdateFinished(this, EventArgs.Empty);
            });
            _syncContext.Send(method, null);
        }
    }
}

Подпишитесь на каждую из областей, где необходимо реагировать на новые обновления, на событие UpdateFinished. Это будет выполнено в потоке, используемом для создания класса PollerThread.

Этот ответ может показаться немного неловким и более конкретно применим к проектам Windows Form, но полезность действительно зависит от вашей текущей реализации. По крайней мере, вы все равно можете это использовать. Надеюсь, это поможет:)

1 голос
/ 06 января 2010

Ваши требования очень подробно описаны, поэтому я могу ответить только в обобщениях:

В целом:

  1. Сколько приложений будет опрашивать одновременно?
  2. Насколько велик набор результатов?

Десять клиентов - это не много, десять тысяч - это много. Десять рядов мало, тысяча рядов становится большим и медленным. Ответы на эти вопросы помогут вам понять, как установить частоту опроса.

Вам необходимо будет сбалансировать другие соображения, такие как отзывчивость пользовательского интерфейса (асинхронное обновление данных), потребность в свежих данных и знания о частоте обновления базы данных, чтобы определить наиболее эффективный и действенный дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...