Monotouch:UIAlertView和WCF服务,调试器.StackTrace

问题描述:

我目前在Monotouch中使用WCF调用现有服务和自定义UIAlertView。Monotouch:UIAlertView和WCF服务,调试器.StackTrace

的问题是,如果我创建一个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(); 
} 

第一次运行的代码,但现在显示警报。第二次模拟器无法启动。 无法在引导服务器上注册“com.yourcompany.wcftest”。错误:未知的错误代码。这通常意味着这个过程的另一个实例已经运行或者挂在调试器中.StackTrace。在这种情况下,我必须重新启动机器。

预先感谢您。

编辑:

谢谢杰夫,我检查了我的代码,进入GetDataCompletedDelegate我插入的UI线程中运行的功能。

InvokeOnMainThread(delegate{ 
doSomething(); 
}); 

private void doSomething() 
{ 
// do stuff here 
_alertView.Hide(); 
} 

继续出现fency错误。如果我在doSomething()方法中使用你的解决方案,它可以工作

_alertView.InvokeOnMainThread(delegate{ 
_alertView.Hide(); 
}); 

为什么?也许我不明白,但是在代码的第一部分中,某些()函数在UI线程中起作用!是不是真的?

+0

总是很好的做法是在主线程上对所有UI进行更改。因此,在'InvokeOnMainThread(delegate {})'中放置'_alertView.Show()'。这有时会导致不正常的行为。它可能无法解决你的问题,但正如我所说,它可能是一些不寻常行为的原因。 – Luke 2011-03-24 12:41:10

+0

谢谢卢克。事实是'_alertView.Show()'(在代码的第二部分)正在主线程中运行,不是真的吗? – 2011-03-24 13:34:17

+1

'_alertView.Hide()'是,但我看不到'.Show()'是...除非你的自定义类在主线程本身上运行它? – Luke 2011-03-24 14:07:17

你在这里有2个单独的问题。

1:_alertView.Hide()是不是在UI线程上运行(这是什么原因造成的围栏错误)

2:在第二个例子中,你在创建后立即处置的UIAlertVeiw,但你有一个实例委托关闭它。这会以一种困难的方式崩溃运行时,然后当你再次运行它时,因为旧的崩溃的进程仍在运行,模拟器不会让你启动第二个实例。使用案例#1,但_alterView.InvokeOnMainThread(委托{_alertView.Hide();}); _alterView.InvokeOnMainThread(委托{_alertView.Hide();});