Vous ne devez en aucun cas faire cela. Une propriété doit toujours être rapide et représente logiquement une propriété de quelque chose. Idéalement, cela ne devrait jamais échouer. Il ne devrait certainement pas produire d'effets secondaires tels que l'apparition de l'interface utilisateur. Vous violez toutes ces directives importantes. Ne fais pas ça.
En outre, votre conception de l'interface utilisateur est mauvaise. Ne demandez pas à un utilisateur à l'avance "cela pourrait prendre un certain temps, êtes-vous sûr?" puis les punir avec une longue attente s'ils cliquent sur oui. Au lieu de cela, démarrez l'opération, et si elle ne revient pas rapidement, faites apparaître un élément de l'interface utilisateur qui affiche une barre de progression et une estimation du temps restant avec un bouton d'annulation.
Vous devriez probablement écrire votre opération de longue durée comme une méthode asynchrone qui peut être annulée proprement sur un autre thread. Une bonne architecture pour ce genre de choses est que votre méthode retourne immédiatement un objet qui expose des événements comme "Je suis toujours en cours d'exécution et voici jusqu'où je suis", ou "J'ai fini maintenant et voici la résultat ", ou" J'ai eu une erreur en essayant de faire l'opération et voici ce que c'est ". Cet objet peut également exposer une méthode "cancel" qui sait comment communiquer avec le thread de travail et l'arrêter proprement. L'appelant de la méthode qui obtient cet objet peut alors décider comment afficher l'interface utilisateur pour l'utilisateur.
Avec cette architecture, vous séparez clairement votre logique d'interface utilisateur, votre logique d'asynchronisme et votre logique de processus métier. C'est un travail, mais ça rapporte plus tard.
Vous pourriez envisager d'en faire une méthode plutôt qu'une propriété, par exemple SetRandomProperty (int). Les setters sont généralement censés être très rapides. – JeffH
Vous pouvez juste 'return;' quand vous voulez, mais vraiment, une fonction set ne devrait pas être longue, ne devrait pas nécessiter d'entrée utilisateur (elle a déjà la valeur après tout), et ne devrait pas lancer d'exceptions. Vous devriez vraiment avoir cette logique dans une fonction séparée, et non dans une méthode set. –
@Tout le monde. Je réalise que c'est une mauvaise idée d'avoir le code UI dans une propriété de classe mais j'utilise une grille de propriété pour définir cette propriété et il n'y a vraiment aucun moyen d'insérer une question MessageBox entre l'interface propertygrid et la classe à laquelle elle est liée , droite? – PICyourBrain