Accès valeur de retour du Thread.Start (), la fonction de délégué
J'ai un programme qui exécute une méthode par un Fil.Commencer. La méthode a une valeur de retour que j'aimerais avoir accès. Est-il un moyen de faire cela? Voici un échantillon...
var someValue = "";
Thread t = new Thread(delegate() { someValue = someObj.methodCall(); });
t.Start();
while (t.isAlive) Thread.Sleep(1000);
//Check the value of someValue
Donc, une fois que la boucle while se termine, le someValue doit être réglé -, mais parce qu'il est exécuté dans un autre thread, il ne va pas ensemble. Est-il un moyen simple pour obtenir un accès?
- Avez-vous essayé de déclarer someValue comme
volatile
? - Même si cette technique de synchronisation est assez bizarre, il devrait travailler avec les volatiles modificateur. +1 pour Anon
Vous devez vous connecter pour publier un commentaire.
Lorsque l'appelant et le filetage de la méthode part d'une variable, vous avez déjà accès à l' - une fois que le thread est terminé, vous venez de vérifier
someValue
.Bien sûr, vous devez connaître lorsque la tige filetée de la méthode est complète pour que cela soit utile. Au fond, il y a deux façons de le faire:
Envoyer un rappel dans le filetage de la méthode qu'il peut exécuter quand il est terminé. Vous pouvez passer votre méthode de rappel
someValue
. Vous pouvez utiliser cette technique si vous n'avez pas de soins lorsque le rappel s'exécute.Utiliser un
WaitHandle
quelconque (ouThread.Join
). Ces vous dire quand une ressource est prêt ou un événement est terminé. Cette technique est utile si vous souhaitez démarrer un thread, faire autre chose, puis attendre jusqu'à ce que le thread se termine avant de continuer. (En d'autres termes, il est utile si vous souhaitez synchroniser le dos avec le fil, juste pas tout de suite.)Je ne peux pas recréer votre question, j'ai le même code et je vois le résultat attendu. Si vous êtes juste d'aller dormir, le thread courant jusqu'à ce qu'elle est complète, vous pouvez simplement appeler .Join() sur le filetage et attendre d'être sûr qu'elle est effectuée en cours d'exécution.
L'une des méthodes possibles pour renvoyer une valeur à partir d'un Thread est d'utiliser une classe de contexte en tant que paramètre de l'objet. Il peut être utilisé pour transmettre des paramètres et de récupérer le résultat en tant que bien.
Si en revanche, vous pouvez utiliser une classe BackgroundWorker, il a déjà dédié un objet de Résultat - qui fonctionne de la même manière. Mais BackgroundWorker ne peuvent pas être utilisés à certaines fins (par exemple, il n'a pas le personnel de soutien de l'Appartement de l'État).
Gardez à l'esprit que vous ne devriez pas lire à partir de ctx.Résultat jusqu'à ce que le thread est terminé (c'est à dire t.IsAlive == false).
Vous pouvez récupérer des données à partir du Fil à l'aide de la fonction de délégué de rappel. Le délégué peut servir de pont entre le fil et l'appelant. Par exemple:
Ont un look à la Modèle De Programmation Asynchrone.
Dans l'une des communes les modèles le modèle décrit, votre classe exposer BeginXXX et EndXXX méthodes. L'ex commence l'opération asynchrone et renvoie un objet IAsyncResult. Celui-ci accepte l'objet IAsyncResult comme argument, bloque le thread appelant jusqu'à ce que l'opération est terminée et renvoie la valeur requise.