我正在使用Xamarin Forms' Entry
在调用OnTextChanged
事件时检索一些数据。
有时,它会抛出一个无法捕获的Java.Lang.ArrayIndexOutOfBoundsException
,这会导致应用程序崩溃。
我使用的代码是:
private void textbox_OnTextChanged(object sender, TextChangedEventArgs e)
{
TextChanged();
}
public async void TextChanged()
{
try
{
if(textbox.Text.Length > 5) //< This sucks and I know it.
{
string text = textbox.Text;
await Task.Run(()=>doSomeMadlyDemandingRandomStuff(text));
}
}
catch(Exception ex)
{
//Bloody exception is never caught.
}
}
我知道TextChanged()
的条件是远离性能的光明,但在这一点上,我只是想让它起作用。
当用户输入一个相当长的句子,或者他退格几次时,就会抛出上述异常。
整个例外是Java.Lang.ArrayIndexOutOfBoundsException: length=20; index=20
。
说明
1)我试图运行Environment.StackTrace
,但它冻结了,我只是不知道它被扔到哪里。对此有任何帮助将不胜感激。
2)当总长度大于20个字符并且await
ed方法直接收到Text
属性时,它曾经抛出这个异常,我怀疑,这个属性是由于正在运行的线程。传递变量(text
)解决了 问题。
3)我知道Java.Lang.ArrayIndexOutOfBoundsException
意味着什么。我只是不知道何时正在访问超出范围的索引。
4)Xamarin表格&#39; Editor
也存在同样的问题。
5)澄清此文本框应该做什么的一些上下文:它应该用作自动完成(能够)条目,其中用户键入几个字母,列表视图填充结果,并且不断更新为其余的字母都是打字的。
答案 0 :(得分:0)
我发现doSomeMadlyDemandingRandomStuff
的潜在问题......如果这需要一段时间,那么什么是阻止用户再次更改文本,从而在完成第一次处理之前再次调用处理程序文字改变了事件?作为测试,您可能希望暂时禁用文本框,直到完成“MadlyDemandingRandomStuff”以查看在第一个处理程序完成之前是否再次调用此处理程序可能是问题的直接原因,例如:
public async void TextChanged()
{
textbox.IsEnabled = false;
try
{
if(textbox.Text.Length > 5) //< This sucks and I know it.
{
string text = textbox.Text;
await Task.Run(()=>doSomeMadlyDemandingRandomStuff(text));
textbox.IsEnabled = true;
}
}
catch(Exception ex)
{
//Bloody exception is never caught.
}
}
我知道这可能不是一个“答案”,但它可能有助于找到问题,所以发布它就是这样。
此外,如果这是本机异常,有时本机异常会导致应用程序崩溃,然后才能将任何异常发送回托管端,因此您的catch块永远不会捕获它。