Если вам нужно обновление для всего приложения, и оно не вызовет слишком большой задержки для обновления, лучший вариант - запустить фон 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, но полезность действительно зависит от вашей текущей реализации. По крайней мере, вы все равно можете это использовать. Надеюсь, это поможет:)