Question

Je suis la programmation en C # .NET. Il est possible d'interrompre la procédure d'ensemble d'une propriété de classe sans lancer une exception?

Voici ce que je veux faire ...

public int RandomProperty
{
    set
    {
     DialogResult answer = new DialogResult();
     answer = MessageBox.Show("This process could take up to 5 min. Are you sure you want to continue?");
     if(answer = DialogResult.No) 
        CancelSet   // Can I do something similar here?
     else
     {
      ...Do set procedure
     }
    }
}

Je ne pense pas que je peux utiliser une méthode (au lieu d'une propriété) parce que je suis en train de cette valeur avec un PropertyGrid.

Était-ce utile?

La solution

En aucun cas vous ne devez faire tout cela. Une propriété doit toujours être rapide et représentent logiquement une propriété de quelque chose. Idéalement, il ne devrait jamais manquer. Il ne devrait certainement pas produire des effets secondaires tels que apparaître l'interface utilisateur. Vous ne respecte pas toutes ces directives importantes. Ne pas le faire.

En outre, la conception de votre interface utilisateur est mauvaise. Ne demandez pas à un utilisateur au préalable « cela pourrait prendre un certain temps, êtes-vous sûr? » puis les punir avec une longue attente si elles cliquez sur Oui. Au lieu de cela, commencer l'opération, et si elle ne, pop revient pas rapidement un élément d'interface utilisateur qui affiche une barre de progression et un temps restant estimé a un bouton d'annulation.

Vous devriez probablement écrire votre opération de longue durée comme une méthode asynchrone qui peut être proprement annulé sur un autre fil.

Une bonne architecture pour ce genre de chose est d'avoir votre retour de méthode immédiatement un objet qui expose des événements comme « Je suis toujours en cours d'exécution et est ici dans quelle mesure le long que je suis », ou « je suis fait maintenant et voici le résultat », ou « Je suis une erreur en essayant de faire l'opération et voici ce qu'il est ». Cet objet peut également exposer une méthode « annuler » qui sait comment communiquer avec le thread de travail et l'éteindre proprement. L'appelant de la méthode qui obtient cet objet peut alors décider comment afficher l'interface utilisateur à l'utilisateur.

Avec cette architecture vous séparez votre logique de l'interface utilisateur, votre logique asynchronisme et votre logique de processus d'affaires de l'autre proprement. Ce travail, mais il verse des dividendes plus tard.

Autres conseils

OMI qui est tout simplement pas une bonne chose à faire - l'attente est que si le set ne jette pas affecté la valeur. Test dans l'interface utilisateur (ou si jamais) avant faire le set, ou lancer et gérer une exception. Sinon, l'appelant peut être moins confus par une méthode:

public bool TrySetRandomProperty(SomeType value) {
    ...
}

qui retourne true ou pour indiquer si false est arrivé. Vous devez également éviter les saignements du code de l'interface utilisateur dans la logique de domaine; peut-être utiliser un événement pour laisser parler à l'utilisateur de l'interface utilisateur sans infliger une implémentation de l'interface utilisateur particulier sur l'appelant?

Ugh. Voulez-vous vraiment impliquer l'interface utilisateur dans une propriété de classe? Vous ne devriez pas effectuer cette vérification plus dans l'interface utilisateur?

Vous pouvez coder certainement cette façon, tout simplement ne définissez pas le champ.

Cependant, vous avez un design très mauvais que vous mixez l'interface utilisateur dans votre code de bas niveau.

Poser la question avant de la propriété est une option.

Il suffit de retourner sur l'ensemble. Vous devrez utiliser un champ privé pour maintenir la valeur de ce que vous voulez définir, mais le retour dans le « annuler » devrait le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top