2010-07-08 10 views
0

Je m'excuse d'avance pour la nature décousue de cette question, mais je n'ai aucune idée par où commencer. J'ai un problème où j'essaie d'ouvrir un fichier Excel dans Silverlight, et de faire un traitement sur ce fichier Excel ... mais j'ai deux problèmes majeurs à faire cela sur le thread principal.BackgroundWorker problèmes dans Siverlight

  1. tout en ouvrant le fichier excel l'interface utilisateur se fige
  2. avec plusieurs appels asynchrones J'ai trouvé que le rappel asynccompleted ne se passe lorsque les extrémités de fil de l'interface utilisateur (dans mon cas, lorsqu'un messagebox ouvre)

Donc j'essaye d'écrire un travailleur de base pour faire mes tâches de traitement, mais je ne trouve pas d'exemples décents (ils sont tous très simplistes). Existe-t-il des ressources pour les modèles d'arrière-plan?

Quand j'ai essayé d'écrire que je suis venu avec les questions suivantes

  1. Je ne pouvais pas accéder à des variables au niveau de la classe (si je veux que la variable pour mon BackgroundWorker devrais-je avoir une classe BackgroundWorker séparée?)

  2. Affichage MessageBoxes et pause fil mi-fond est trop compliqué (ce que cela signifie que je devrait avoir beaucoup de petits travailleurs de fond?)

  3. porter à 2 comment afficher messages d'erreur.

+0

BGW ne résoudra pas votre problème. Excel est mono-thread, le travail sera toujours effectué sur le thread de l'interface utilisateur. –

+0

owch! Dans ce cas, je vais essayer de comprendre pourquoi certains de mes rappels terminés ne tirent qu'à la fin. –

+0

oui, vient de faire une expérience, et ne peux pas ouvrir le doc excel sur le fil de fond, alors dois oublier celui-ci ... –

Répondre

2

En ce qui concerne le point 3, vous ne pouvez pas utiliser l'interface utilisateur directement à partir du thread BackgroundWorker. Ce que vous devez faire est de déclencher un événement avec toutes les informations nécessaires dans les arguments d'événement et gérer cet événement sur le thread d'interface utilisateur.

donc en ce qui concerne vos boîtes de message que vous le feu et l'événement avec le message dans les arguments d'événement

public class MessageBoxEventArgs : EventArgs 
{ 
    public MessageBoxEventArgs(string message) 
    { 
     this.Message = message; 
    } 

    public string Message 
    { 
     get; private set; 
    } 
} 

feu de l'événement:

public event EventHandler<MessageBoxEventArgs> Message_Event; 

... 


     if (this.Message_Event!= null) 
     { 
      this.Message_Event(this, new MessageBoxEventArgs(message)); 
     } 

ensuite de le gérer:

private void MessageEventHandler(object sender, MessageBoxEventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke((MethodInvoker)delegate { MessageBox.Show(e.Message); }); 
     } 
     else 
     { 
      MessageBox.Show(e.Message); 
     } 
    }