我目前正在使用单片机中的WCF来调用现有服务和自定义UIAlertView。
问题是,如果我创建一个UIAlertView作为类实例,我会执行以下操作:
public override void ViewDidAppear()
{
_alertView.Message = "Loading...";
_alertView.Show();
_client.GetDataAsync("test");
_client.GetDataCompleted += GetDataCompletedDelegate;
base.ViewDidAppear();
}
void GetDataCompletedDelegate(object sender, GetDataEventArgs)
{
// do someting with data
_alertView.Hide();
}
它有效,但这个建议写在控制台中: UIAlertView:wait_fences:未能收到回复:10004003
否则,如果我尝试运行此代码:
public override void ViewDidAppear()
{
using(CustomAV _alertView = new CustomAV())
{
_alertView.Message = "Loading...";
_alertView.Show();
_client.GetDataAsync("test");
_client.GetDataCompleted += delegate{
InvokeOnMainThread(delegate{
// do someting with data
_alertView.Hide();
});
};
}
base.ViewDidAppear();
}
第一次运行代码,但现在显示警报。第二次模拟器无法启动。 无法在bootstrap服务器上注册“com.yourcompany.wcftest”。错误:未知的错误代码。这通常意味着此进程的另一个实例已在调试器中运行或挂起.StackTrace。在这种情况下,我必须重新启动计算机。
提前谢谢。
修改
谢谢Geoff,我已经检查了我的代码并进入了GetDataCompletedDelegate,我插入了一个在UI Thread中运行的函数。
InvokeOnMainThread(delegate{
doSomething();
});
private void doSomething()
{
// do stuff here
_alertView.Hide();
}
fency错误继续出现。如果我在doSomething()方法中使用你的解决方案,它可以工作
_alertView.InvokeOnMainThread(delegate{
_alertView.Hide();
});
为什么呢?也许我不理解,但在第一段代码中做某事()在UI线程中工作!不是真的吗?
答案 0 :(得分:1)
这里有两个独立的问题。
1:_alertView.Hide()未在UI线程上运行(这是导致围栏错误的原因)
2:在你的第二个例子中,你在创建UIAlertVeiw之后立即处理它,但是你有一个实例委托悬挂它。这会以一种困难的方式崩溃运行时,然后再次运行它,因为旧的崩溃进程仍在运行,模拟器不会让你启动第二个实例。
用例#1但是_alterView.InvokeOnMainThread(委托{_alertView.Hide();});