я собираюсь сделать обоснованное предположение, что вы не поднимая событие A или событие B себя; скажем, событие А событие TextBox1.TextChanged и событие B это событие TextBox2.TextChanged, и у них есть обработчики, как:
public void Textbox1_TextChanged(object sender, EventArgs e)
{
...
TextBox2.Text = someString;
}
public void Textbox2_TextChanged(object sender, EventArgs e)
{
...
TextBox1.Text = someOtherString;
}
В этом случае обработчики каждый собирается поднять TextChanged событие другого TextBox путем в силу изменения текста, что приводит к бесконечной рекурсии.
Первое, что вы можете сделать, если хотите, чтобы оба запускались только один раз и только один раз, - это отметить, что они уже запущены (изменение текста другого текстового поля приводит к тому, что обработчик событий в текстовом поле работает в одном вызове стек:
public void Textbox1_TextChanged(object sender, EventArgs e)
{
if(handler1Running) return; //the second time through we exit immediately
handler1Running = true;
...
TextBox2.Text = "Something"; //the other event handler is invoked immediately
handler1Running = false;
}
public void Textbox2_TextChanged(object sender, EventArgs e)
{
if(handler2Running) return; //the second time through we exit immediately
handler2Running = true;
...
TextBox1.Text = "Something Else"; //the other event handler is invoked immediately
handler2Running = false;
}
Теперь, самые глубокая она будет идти три уровня; 1 в обработчик вызывает обработчик 2, который вызывающий обработчик 1 снова, который видит, что 1 в обработчик уже запущен и завершает работу, прежде чем делать что-либо, что углубится рекурсия. То же самое, если вы начнете с изменения TextBox2.
Другое, что вы можете сделать, это убедиться, что вы Не пытайтесь установить текстовое поле на то же значение, которое уже существует. Изменяя одну ссылку на другую, даже если обе ссылки имеют одно и то же строковое значение, загорается событие TextChanged. Если рекурсия должна продолжаться естественным образом, но достигнет устойчивого состояния, на самом деле это первое, что нужно попробовать:
public void Textbox1_TextChanged(object sender, EventArgs e)
{
StringBuilder builder = new StringBuilder();
... //build string
//now, even though the builder's ToString will produce a different reference,
//we're making sure we don't unnecessarily change the text.
if(builder.ToString != TextBox2.Text)
TextBox2.Text = builder.ToString();
}
public void Textbox2_TextChanged(object sender, EventArgs e)
{
StringBuilder builder = new StringBuilder();
... //build string
//now, even though the builder's ToString will produce a different reference,
//we're making sure we don't unnecessarily change the text.
if(builder.ToString != TextBox1.Text)
TextBox1.Text = builder.ToString();
}
Не могли бы вы более подробно описать, какую проблему вы решаете? Я думаю, что мы сможем дать вам лучший ответ, если бы у нас был лучший контекст, чем событие A запускает событие B, которое рекурсивно запускает событие A. Некоторое изменение должно произойти. – TheGeekYouNeed
Почему они называют друг друга и не называют какой-либо метод, который предоставляет функции, которые вы хотите вызвать? –
У вас есть два варианта решения этой проблемы. Установите предел для вашей рекурсии, возможно, через свойство синхронизации или создайте код обработки событий таким образом, чтобы не выполнять операции, которые запускают дополнительные события. В любом случае, у вас недостаточно подробностей, чтобы предложить ответ. Может быть, если вы разместите какой-нибудь код? – JamieSee