Продолжайте слушать SQLDependency

У меня есть приложение Windows Form, которое использует Notifier для захвата события изменения SQLDependency с Entity Framework, и все работает нормально. EntityChangeNotifier — это проект, который разрабатывает SQLDependency.

При звонке while (true) я могу продолжить прослушивание, и когда у меня будет изменение, введите код в notifer.Changed += (sender, e)

        private StartNotifier()
        {
            var info = new SABIntegrationEntities();
            // Notifier
            using (var notifer = new EntityChangeNotifier<SpRicezioneSpedizioniLightNotifier, GemapDbContext>(p => p.SPEDIZIONE_STATO_GENERAZIONE == "I" || p.SPEDIZIONE_STATO_GENERAZIONE == "U"))
            {
                notifer.Error += (sender, e) =>
                {
                    Log.Error(String.Format("[{0}, {1}, {2}]:\n{3}", e.Reason.Info, e.Reason.Source, e.Reason.Type, e.Sql));
                };
                notifer.Changed += (sender, e) =>
                {
                    e.ContinueListening = false;
                    bool result = true;
                    var spedizioniI = info.SpRicezioneSpedizioniLights.Where(x => x.SPEDIZIONE_STATO_GENERAZIONE == "I" || x.SPEDIZIONE_STATO_GENERAZIONE == "U");
                    foreach (var p in spedizioniI)
                        {
                            p.SPEDIZIONE_STATO_GENERAZIONE = "G";
                        }
                    }
                    e.ContinueListening = true;
                };
                while (true)
                {
                }
           }
       }

Я хочу продолжать слушать этот код лучше, чем пока (true). Как мне это сделать?

Если вы хотите, вы можете найти полную структуру проекта здесь: введите здесь описание ссылки

Спасибо всем


person Ale    schedule 15.04.2016    source источник


Ответы (1)


Ваш оператор using удаляет notifer при выходе из метода StartNotifier. Удалите статусы using и while, поместите notifer в поле закрытого класса, реализуйте интерфейс IDisposable и удалите notifer в методе Dispose. Вы должны получать сообщения до тех пор, пока ваш класс, содержащий метод StartNotifier, не будет удален.

РЕДАКТИРОВАТЬ: фрагмент кода, чтобы дать вам представление:

public partial class Form1 : Form
{
    private readonly EntityChangeNotifier<SpRicezioneSpedizioniLightNotifier, GemapDbContext> _entityChangeNotifier;
    public Form1()
    {
        InitializeComponent();
        _entityChangeNotifier = StartNotifier();
    }

    private EntityChangeNotifier<SpRicezioneSpedizioniLightNotifier, GemapDbContext> StartNotifier()
    {
        var notifer = new EntityChangeNotifier<SpRicezioneSpedizioniLightNotifier, GemapDbContext>(
            p => p.SPEDIZIONE_STATO_GENERAZIONE == "I" || p.SPEDIZIONE_STATO_GENERAZIONE == "U");
        notifer.Error += (sender, e) => { /*log*/ };
        notifer.Changed += (sender, e) => { /*action when chagned*/};
        return notifer;
    }
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
            _entityChangeNotifier.Dispose();
        }
        base.Dispose(disposing);
    }
}
person Miłosz Wierzbicki    schedule 15.04.2016
comment
Спасибо за ваш ответ. Как я могу избавиться от единственного уведомителя и повторно активировать новый уведомитель, если у меня есть ошибка? Я хочу автоматически перезапустить уведомитель, если у меня такая же ошибка при прослушивании. - person Ale; 22.04.2016