0

J'essaie d'utiliser une classe imbriquée pour obtenir deux classes à passer dans un seul argument afin que je puisse l'envoyer à un arrière-plan. Jusqu'à présent, j'ai réussi à passer des arguments simples dans un backgroundworker mais je dois encore le faire avec une classe imbriquée où je finis par passer les deux ou mes classes désirées dans le même argument. Alors, est loin ici une partie du code que je utilise:Utilisation d'une classe imbriquée pour passer plusieurs arguments dans un arrière-plan

Ceci est la classe Nested je tente d'utiliser:

public class MyBackGroundWorkerObject 
{ 
    public class TimeZone 
    { 
     public string Zone; 

     public int difference; 

     public override string ToString() 
     { 
      return Zone; 
     } 
    } 

    public class AccountName 
    { 
     public string AccountSid; 
     public string AuthToken; 
     public string Name; 
     public override string ToString() 
     { 
      return Name; 
     }  
    } 

} 

Voici un exemple de l'une des classes en action:

MyBackGroundWorkerObject.AccountName acct = new MyBackGroundWorkerObject.AccountName(); 
     //AccountName acct = new AccountName(); 
     acct.AccountSid = "abcd"; 
     acct.AuthToken = "xyz"; 
     acct.Name = "Potato"; 
     ddlAccounts.Items.Add(acct); 

MyBackGroundWorkerObject.TimeZone region = new MyBackGroundWorkerObject.TimeZone(); 
     //TimeZone region = new TimeZone(); 
     region.Zone = "UTC"; 
     region.difference = 0; 
     comboBox1.Items.Add(region); 

Et voici la partie où je suis complètement confus, j'aimerais pouvoir utiliser ces deux éléments lorsque j'appelle de la fenêtre Formulaire d'où il récupère certaines des données saisies. Je ne sais pas sur la façon d'obtenir ces deux classes pour travailler dans conjuction où je peux les envoyer les deux en même temps à l'BackgroundWorker:

MyBackGroundWorkerObject myBackGroundWorker1 = new MyBackGroundWorkerObject(); 
object obj = ddlAccounts.SelectedItem; 

      MyBackGroundWorkerObject.AccountName acct = obj as MyBackGroundWorkerObject.AccountName; 
backgroundWorker1.RunWorkerAsync(acct); 
+0

Ne pas utiliser 'BackgroundWorker'. Au lieu de cela, utilisez 'await'. – SLaks

+0

Au-delà du point où il est possible de changer ce code. –

+0

Vous avez défini les classes imbriquées dans MyBackGroundWorkerObject mais il n'y a pas de variable de type TimeZone ni de type AccountName déclarée dans la classe MyBackGroundWorkerObject. –

Répondre

0

Vous défini les classes imbriquées à l'intérieur MyBackGroundWorkerObject mais il n'y a pas de variable de type TimeZone ni de type AccountName déclaré dans la classe MyBackGroundWorkerObject.

public class MyBackGroundWorkerObject 
{ 
    public class TimeZone 
    { 
     public string Zone; 

     public int difference; 

     public override string ToString() 
     { 
      return Zone; 
     } 
    } 

    public class AccountName 
    { 
     public string AccountSid; 
     public string AuthToken; 
     public string Name; 
     public override string ToString() 
     { 
      return Name; 
     }  
    } 

    public TimeZone TheTimeZone {get; set;} 
    public AccountName TheAccountName {get; set;} 

} 

Maintenant, vous pouvez définir vos instances via le TheTimeZone et les membres TheAccountName respectivement et les accès lorsque vous passez le MyBackGroundWorkerObject.

MyBackGroundWorkerObject myBackGroundWorker1 = new MyBackGroundWorkerObject(); 
MyBackGroundWorkerObject.AccountName acct = new MyBackGroundWorkerObject.AccountName(); 
    //AccountName acct = new AccountName(); 
    acct.AccountSid = "abcd"; 
    acct.AuthToken = "xyz"; 
    acct.Name = "Potato"; 
    ddlAccounts.Items.Add(acct); 

MyBackGroundWorkerObject.TimeZone region = new MyBackGroundWorkerObject.TimeZone(); 
    //TimeZone region = new TimeZone(); 
    region.Zone = "UTC"; 
    region.difference = 0; 
    comboBox1.Items.Add(region); 

myBackGroundWorker1.TheTimeZone = region; 
myBackGroundWorker1.TheAccountName = acct; 

backgroundWorker1.RunWorkerAsync(myBackGroundWorker1); 

A l'intérieur du travailleur de fond DoWork jeté à MyBackGroundWorkerObject et l'accès via .TheTimeZone et .TheAccountName à nouveau

+0

Vous êtes mort, ce à peu près ce dont j'ai besoin, sauf pour la partie où j'ai la plupart des variables déclarées et où je l'envoie à l'arrière-plan sont dans deux zones différentes (Form1() vs ButtonClick()) afin de donnez à l'utilisateur le temps de sélectionner le bon champ. Alors, comment pourrais-je obtenir ceci: backgroundWorker1.RunWorkerAsync (myBackGroundWorker1); travailler dans le bouton cliquer? –

+0

Eh bien, cela dépend complètement de votre interface utilisateur. Si l'utilisateur sélectionne par ex. Quelque chose provenant des différentes zones de liste (le nom et le fuseau horaire) que vous pourriez utiliser dans les événements SelectedItemChanged remplit respectivement les propriétés de MyBackGroundWorkerObject d'un niveau de formulaire créé, puis le transmet simplement sur l'événement click button. Encore une fois, il n'y a pas assez de code pour répondre à cette question et c'est une question complètement distincte. –

+0

Génial, bien merci pour votre réponse. Je pense que vous avez suffisamment répondu à ma question en fonction des ressources que je vous ai données :) –