6
votes

Ref dans la tâche Async

Comment puis-je passer à transmettre une référence en tant que paramètre à la méthode ASYNC dans l'application Windows Store?
Je cherche quelque chose comme ceci: xxx

mais erreur:

Les méthodes Async ne peuvent pas avoir de paramètres Ref ou Out

a une autre manière?

Remarque:
J'ai besoin de passer exactement obj.value. Cette méthode serait utilisée par différents types d'objets, par même type d'objets, par un objet, mais je vais passer obj.val_1, obj.val_2 ou obj.val_10. Toutes les valeurs seront de même type (pour la chaîne ex)


0 commentaires

4 Réponses :


7
votes

Vous pouvez transmettre directement l'objet lui-même et définir la valeur de la propriété correspondante à l'intérieur de la méthode: xxx

et si vous n'avez pas de tel objet, écrivez simplement une et que la méthode async prend cet objet comme paramètre: xxx


3 commentaires

S'il vous plaît, lisez la question: j'ai besoin de passer exactement obj.value. Cette méthode serait utilisée par différents types d'objets, par même type d'objets, par un objet, mais je vais passer obj.val_1, obj.val_2 ou obj.val_10


Veuillez lire le message d'erreur que vous obtenez: Ceci n'est pas pris en charge en C # et sauf si vous n'écrivez à un compilateur vous-même prenant en charge le passage des variables réf / sorties à Async Méthodes Je ne vois pas comment vous pouvez résoudre votre problème . Que pensez-vous d'autre que je vous le dise? Montrez-vous un exemple de travail de la façon de faire quelque chose qui n'est pas pris en charge?


Ma question est la suivante: "a une autre façon?" La réponse doit être abrégée: "Non, parce que ..." ou "Oui, tu dois faire ..." et répondez à laquelle vous fournissez déjà inutile.



1
votes

Vous ne pouvez pas faire cela comme vous l'avez (comme vous le savez). Donc, quelques points de contournement:

Vous pouvez le faire en passant à l'objet initial car il s'agira d'un type de référence xxx

modifier < / P>

En fonction de vos commentaires, créez une interface et que vos classes l'appliquent (fournissant-la toujours le même type que vous souhaitez passer). Ensuite, vous pouvez transmettre l'interface partagée (peut-être sur tuer, dépend de vos besoins, voire une quantité irréaliste de travail).

ou, fournissez une classe de base avec la propriété! (Je n'aime pas cette suggestion, mais puisque vous demandez quelque chose qui ne peut pas être fait, il peut suffire que je ne le recommande pas).

Un exemple de l'interface est ici (non en utilisant ce que vous avez, mais étroit suffisamment à l'aide d'une application de colsone) xxx

EDIT2

Après les commentaires suivants, vous aurez Pour toujours utiliser une interface, mais vous attribue la valeur par la suite. Je suis sûr qu'il y a une meilleure façon de le faire, mais cela fonctionne: xxx


8 commentaires

S'il vous plaît, lisez la question: j'ai besoin de passer exactement obj.value. Cette méthode serait utilisée par différents types d'objets, par même type d'objets, par un objet, mais je vais passer obj.val_1, obj.val_2 ou obj.val_10


@jimpanzer, j'ai fait - votre message ne mentionne jamais qu'il sera utilisé par différents types d'objets! Puis-je supposer que ce que VAL_1, VAL_2, etc. soit le même type?


VAL_1, VAL_2, VAL_10 - Tout le même type (chaîne ou int ou un autre, mais identique). Je dois passer une seule valeur, car je reçois cette valeur de différents endroits.


@jimpanzer, mis à jour - Vous pouvez peut-être utiliser une interface pour cela.


Je comprends votre idée, mais dans ma classe peut être numéro, numéro1, numéro2 ... et de nombreux autres chiffres. Et je veux passer une seule valeur. Mais merci que vous passez votre temps.


@jimpanzer, OK, c'est ma dernière tentative :) Encore une fois, pas la solution la plus belle, mais cela vous donne une idée.


Laissez-nous Continuez cette discussion en chat


@jimpanzer, je suis désolé, je n'ai tout simplement pas plus de temps aujourd'hui. Bonne chance si, espérons-le, cela aide au moins!



2
votes

Vous pouvez toujours utiliser la classe tâche <> et renvoyer la valeur souhaitée. Ensuite, votre code ressemblerait à quelque chose comme: xxx

edit

OK, l'autre moyen d'aller avec cela que je peux penser à cela. la mise à jour de l'élément de l'objet donné dans une méthode, puis adoptant une action invoquant cette méthode comme argument de la tâche, comme: xxx

aussi loin que je l'ai testé le changement était Fabriqué dans le fil de l'enfant, mais il est toujours à effet visible dans le fil parent. J'espère que cela vous aide.


2 commentaires

Je sais de cette façon, mais je cherche une façon, je peux changer de valeur à l'intérieur de la tâche ASYNC. Mais +1 pour vous.


À propos de votre édition: vous n'êtes pas autorisé à utiliser le paramètre Réflexion à l'intérieur de Lambda Expression.



11
votes

Si vous ne vous souciez pas d'un peu de frais générale et éventuellement une durée de vie prolongée de vos objets, vous pouvez imiter le comportement REF en passant un seigment et une méthode getter à la fonction, comme ceci:

await DoStuff(() => obj.Value, x => obj.Value = x);


2 commentaires

Je crois que c'est une bonne réponse pour plusieurs raisons et il peut étendre la réutilisabilité de ses nombreux types d'objet en le faisant générique: Dostuff (Func Getter, action Setter ) .


Nate Diamond, je pense que la fonction et l'action sont déjà des délégués de type générique