2011-03-24 2 views
1

Je suis actuellement en utilisant WCF dans MonoTouch pour appeler un service existant et un UIAlertView personnalisé.MonoTouch: Services UIAlertView et WCF, debugger.StackTrace

Le problème est que si je crée un UIAlertView comme instance de classe et je fais ce qui suit:

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(); 
} 

cela fonctionne, mais ce conseil est écrit dans la console: UIAlertView: wait_fences: n'a pas reçu de réponse: 10004003

autre, si je tente d'exécuter ce code:

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(); 
} 

la première fois que l'exécution de code, mais maintenant l'alerte est affichée. La deuxième fois, le simulateur ne peut pas démarrer. Impossible d'inscrire « com.yourcompany.wcftest » avec le serveur d'amorçage. Erreur: code d'erreur inconnu. Cela signifie généralement qu'une autre instance de ce processus était déjà en cours d'exécution ou est suspendue dans le débogueur. StackTrace. Dans ce cas, je dois redémarrer la machine.

Merci d'avance.

EDIT:

Merci Geoff, j'ai vérifié mon code et en GetDataCompletedDelegate j'ai inséré une fonction qui fonctionne à l'intérieur de l'interface utilisateur fil.

InvokeOnMainThread(delegate{ 
doSomething(); 
}); 

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

L'erreur de clarté persiste. Si j'utilise votre solution dans la méthode doSomething(), cela fonctionne

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

Pourquoi? Peut-être que je n'ai pas compris, mais dans le premier extrait de code faire quelque chose() fonctionne dans le fil de l'interface utilisateur !! N'est-ce pas vrai?

+0

Il toujours bon de courir * tous * les modifications à l'interface utilisateur sur le thread principal. Mettez donc votre _alertView.Show() 'dans un' InvokeOnMainThread (delegate {}) '. Cela peut parfois provoquer un comportement inhabituel. Cela peut ne pas résoudre votre problème, mais comme je l'ai dit, cela peut être la cause d'un comportement inhabituel. – Luke

+0

Merci Luc. Le fait est que _alertView.Show() '(dans la deuxième section du code) s'exécute dans le thread principal, insn't vrai? –

+1

la '_alertView.Hide()' est, mais je ne peux pas voir que le '.Show()' est ... à moins que votre classe personnalisée, il fonctionne sur le fil principal lui-même? – Luke

Répondre

1

Vous avez 2 problèmes séparés ici.

1: _alertView.Hide() ne fonctionne pas sur le thread d'interface utilisateur (ce qui est ce qui provoque l'erreur de clôtures)

2: Dans votre deuxième exemple vous disposer le UIAlertVeiw immédiatement après l'avoir créé, mais vous avoir un délégué d'instance balancé il. Cela bloque le runtime de manière difficile, puis lorsque vous l'exécutez à nouveau car l'ancien processus écrasé est toujours en cours, le simulateur ne vous permet pas de démarrer une seconde instance.

Cas d'utilisation # 1 mais faire _alterView.InvokeOnMainThread (délégué {_alertView.Hide();});