2011-05-16 6 views
-2

Можно создать дубликат:
Cross thread problem?проблема с перекрестными потоками? C#

У меня есть проблема, когда я называю эту тему. Моя идея - когда вы выбираете папку mail - do Func1 является MessageCollections() , когда Func1 заканчивается, а затем Download Mail in Folder - Func2 is SaveMail() , когда загрузка заканчивается одной почтой, а затем добавляет элемент в listview - Func3 - это AddMesToMailList() , но что-то не так в моем коде, вы можете мне помочь? Ошибка: Поперечные нити в линии MailTree.SelectedNode.Text

private delegate void SaveMailDelegate(); 
      private void AddMesToMailList(IAsyncResult ia) 
      { 
        ListViewItem item = new ListViewItem(); 
        Mime m = EncodingMail(MailTree.SelectedNode.Text, mes); 
        item.Text = mes.MessageUid.ToString(); 
        item.SubItems.Add(m.MainEntity.Subject); 
        ReturnMime(m); 
        if (mailfromname != null) 
         item.SubItems.Add(mailfromname); 
        else item.SubItems.Add(mailfrom); 
        item.SubItems.Add(m.MainEntity.Date.ToString()); 
        item.SubItems.Add(mailfrom); 
        MailList.Items.Add(item);   
      } 
      private delegate ImapX.MessageCollection SelectMailFolder(string foldername); 
      ImapX.MessageCollection MessageCollections(string foldername) 
      { 
       return messages=client.Folders[foldername].Search("ALL", false); 
      } 
    public void SaveMail() 
      { 
       string path1= "D:\\" ; 
       string path2=Username; 
       string path3=MailTree.SelectedNode.Text; 
       string path4 = mes.MessageUid.ToString() + ".eml"; 
       // @"D:\" + Username + "\\" + MailTree.SelectedNode.Text + "\\" + mes.MessageUid.ToString() + ".eml")\ 
       string path=Path.Combine(path1,path2,path3,path4); 
       string savepath = Path.Combine(path1, path2, path3); 
       if (!File.Exists(path)) 
       { 
        mes.Process(); 
        mes.SaveAsEmlToFile(savepath, mes.MessageUid.ToString()); //Store messages to a Location 
       } 
      } 


    private void MailTree_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) 
       { 
           MailList.Items.Clear(); 
           for (int i = 0; i < client.Folders.Count; i++) 
           {       
            (ContextMenuListView.Items[1] as ToolStripMenuItem).DropDownItems[i].Click += new EventHandler(MainForm_Click); 
           } 
           if (MailTree.SelectedNode.Text == Username) 
           { 
            webBrowser1.Visible = false;//webBrowser1.DocumentText = "Hello Baby"; 
            AttachmentList.Visible = false; 
            groupBox1.Visible = false; 
           } 
           else 
           { 
            webBrowser1.Visible = true; 
            groupBox1.Visible = true; 
            string select = MailTree.SelectedNode.Text;       
            //messages = client.Folders[select].Search("ALL", false);// Search mail in your choossen Folder 
            SelectMailFolder se = null; 
            se += new SelectMailFolder(MessageCollections); 
            se.BeginInvoke(select,new AsyncCallback(NewMethod), null);       

           } 
       } 

       private void NewMethod(IAsyncResult ias) 
       { 
        AmoutOfMail = messages.Count(); //Amout of Mail in this Folder           
        for (int i = 0; i < AmoutOfMail; i++) 
        { 
         mes = messages[i]; 
         SaveMailDelegate del = null; 
         del += new SaveMailDelegate(SaveMail); 
         IAsyncResult ia = del.BeginInvoke(new AsyncCallback(AddMesToMailList), null); 
        } 
       } 
+6

«но что-то неправильно в моем коде»: Это всегда хорошо, чтобы указать, что вы считаете неправильным/почему вы думаете, что это неправильно/любые ошибки, которые вы получаете. – forsvarir

+0

Что-то не так ...? , как бы любой орган на земле знал, в чем проблема, с которой вы сталкиваетесь. Задайте вопрос – TalentTuner

+0

@forsvarir: потому что есть ошибка в перекрестных потоках: | – giaosudau

ответ

2

С моей дикой догадкой, вы можете получать перекрестный контроль резьбы probelm доступа, который встречается, когда вы касаетесь какого-либо контроля пользовательского интерфейса из другого потока кроме основной линии пользовательского интерфейса

+0

да это моя проблема :( – giaosudau

4

Вы вызываете AddMesToMailList в отдельной теме. Вы не можете взаимодействовать с элементами Gui из другой нити. Используйте Invoke, чтобы переключиться на Gui нить

this.Invoke(new Action(AddMesToMailList))

+0

имеют ту же ошибку :( – giaosudau

Смежные вопросы