У меня есть определенное приложение, которое вводит информацию в объект после сравнения новой информации со старой. Это похоже на
set
{
oldval=_value;
_value=value;
if (some comparison logic)
raiseEvent();
}
Все это происходит в фоновом потоке в бесконечном цикле, который периодически спит в течение 100 мс. Действительно странно то, что он работает в первый раз, логика сравнения оказывается верной и возникает событие. После этого информация продолжает поступать, она продолжает поступать в объект, я знаю это, потому что я установил MessageBoxes для постоянного отображения старых и новых значений, но это как если бы он каким-то образом обошел предложение set! Я установил окно сообщения в начале предложения, оно просто не всплывает! Это действительно странно, поскольку я уверен, что значение постоянно обновляется.
Какие-нибудь мысли?
Да, я знаю, но, к сожалению, я мало что могу показать ... Позвольте мне еще раз объяснить общую структуру: У меня есть отдельный фоновый поток, выполняющий бесконечный цикл. Этот цикл непрерывно извлекает данные из объекта Data, который обновляется целым другим набором потоков. Все это, конечно, синхронизируется с Monitor.Enter и Exit. Данные, извлеченные из объекта Data, затем вводятся в объект Comparer.
while(true)
{
Thread.Sleep(100);
Monitor.Enter(Data);
Comparer.Value = Data.Value;
Monitor.Exit(Data);
}
Comparer.Value - это свойство, о котором я упоминал в первом посте. Это действительно довольно странно, так как я установил MessageBox в конце цикла:
MessageBox.Show(Comparer.Value + " - " + Data.Value);
и значения действительно обновляются, это просто как-то обходит предложение set, что невозможно ... Это действительно странно.
И Роб, цикл не выполняет никаких проверок, он просто имитирует поток информации в Comparer.Value; Предложение set содержит логику сравнения.
bh213, я доволен, что это так, но я не могу сказать, потому что сравнение останавливается до того, как будет выполнена какая-либо значимая проверка.
Хорошо, я решил проблему, видимо, мой вопрос был неправильным, проблема была в другом месте. Спасибо за помощь, вопрос может быть закрыт.





Вам действительно нужно предоставить больше информации. Все, что у нас есть, это какой-то псевдокод. Попробуйте придумать короткая, но полная программа, демонстрирующий проблему.
Без значимого кода мы можем только догадываться. В частности, если добавление MessageBox в начало Set не появляется, то, вероятно, проблема в вызывающем коде (не в этом).
Тем не менее, некоторые мысли - особенно если у вас несколько потоков:
Этого не могло быть; без некоторого примера кода мы действительно не сможем помочь.
Я выделил сходство потоков жирным шрифтом, так как это очень вероятная проблема, если ваш рабочий вносит изменения, которые (через событие) пользовательский интерфейс отслеживает; обработчик событий пользовательского интерфейса должен переключается на поток пользовательского интерфейса для обновления пользовательского интерфейса:
void SomeHandler(object sender, EventArgs args)
{
this.Invoke((MethodInvoker)delegate {
this.Text = "Something happened";
});
}
Предыдущие ответы абсолютно верны в том, что вам нужно предоставить больше информации.
Но можно спросить Почему, что вы так делаете? Конечно, ваша бизнес-модель просто вызовет событие, когда значение установлено, почему существует фоновый поток, который периодически проверяет?
Возможно, мне просто что-то не хватает, но кажется, что здесь есть недостаток дизайна, который вызывает проблему настоящий.
Поскольку событие возникает в фоновом потоке, все ваши обработчики событий запускаются в этом (фоновом) потоке. Ваш код правильно с этим справляется?
Как говорили другие, вам действительно нужно создать небольшой рабочий пример, чтобы показать проблему.
Возможно, вы даже сами заметите источник своей проблемы при создании этого примера приложения.
Спам System.Diagnostic.Debug.WriteLine вокруг вместо ящиков сообщений. Они не изменяют (или, по крайней мере, в минимальной степени) не изменяют поток инструкций и не имеют проблем с потоками (кроме возможного плохого вывода).
Кроме того, из описания кажется, что может помочь простой сеанс отладки с тщательно размещенными точками останова.
В-третьих, что такое «(некоторая логика сравнения)»?
Если это простой (oldval! = _Value), перепишите его как
set
{
if (_value != value)
{
_value=value;
RaiseSomeEvent();
}
}
он чище, и у вас нет шансов изменить _value без возникновения события (кроме подписанных обработчиков ..).
В противном случае выражение «(некоторая логика сравнения)», скорее всего, является ошибочным местоположением.
Похоже, рабочий снабжение вносит изменения, а не следит за ними. Вот почему меня особенно беспокоит сходство потоков.