交叉线程问题?C#

交叉线程问题?C#,c#,multithreading,C#,Multithreading,可能重复: 我调用此线程时遇到问题。 我的想法是,当您选择文件夹mail-DoFunc1是MessageCollections() Func1完成后,下载文件夹中的邮件-Func2为SaveMail() 下载完成一封邮件后,将项目添加到listview中-Func3为AddMestomailist() 但是我的代码有问题,你能帮我吗? 错误是:行MailTree.SelectedNode.Text中的交叉线程 private delegate void savemaildegate(); 私人

可能重复:

我调用此线程时遇到问题。 我的想法是,当您选择文件夹mail-DoFunc1是MessageCollections() Func1完成后,下载文件夹中的邮件-Func2为SaveMail() 下载完成一封邮件后,将项目添加到listview中-Func3为AddMestomailist() 但是我的代码有问题,你能帮我吗? 错误是:行MailTree.SelectedNode.Text中的交叉线程

private delegate void savemaildegate();
私人空旷加德梅斯托马利斯特(IAsyncResult ia)
{
ListViewItem=新建ListViewItem();
Mime m=编码邮件(MailTree.SelectedNode.Text,mes);
item.Text=mes.MessageUid.ToString();
项目。子项目。添加(m.maintentity.Subject);
(m);
if(mailfromname!=null)
item.SubItems.Add(mailfromname);
else item.SubItems.Add(mailfrom);
item.SubItems.Add(m.maintentity.Date.ToString());
item.SubItems.Add(mailfrom);
邮件列表.项目.添加(项目);
}
私有委托ImapX.MessageCollection SelectMailFolder(字符串foldername);
ImapX.MessageCollection MessageCollections(字符串foldername)
{
返回消息=客户端。文件夹[foldername]。搜索(“全部”,false);
} 
public void SaveMail()
{
字符串路径1=“D:\\”;
字符串路径2=用户名;
字符串路径3=MailTree.SelectedNode.Text;
字符串路径4=mes.MessageUid.ToString()+“.eml”;
//@“D:\”+用户名+“\\”+邮件树.SelectedNode.Text+“\\”+mes.MessageUid.ToString()+“.eml”)\
字符串路径=path.Combine(路径1、路径2、路径3、路径4);
字符串savepath=Path.Combine(路径1、路径2、路径3);
如果(!File.Exists(path))
{
mes.Process();
mes.SaveAsEmlToFile(savepath,mes.MessageUid.ToString());//将消息存储到某个位置
}
}   
private void MailTree_AfterSelect(对象发送方,System.Windows.Forms.TreeViewEventArgs e)
{ 
MailList.Items.Clear();
对于(int i=0;i
根据我的猜测,您可能会遇到跨线程控件访问问题,当您从主UI线程以外的另一个线程中触摸任何UI控件时,就会发生这种情况,您正在另一个线程中调用
AddMestomailist
。您不能从另一个线程与Gui元素交互。使用Invoke切换到Gui线程


this.Invoke(newaction(addmestomailist))

“但我的代码有问题”:指出您认为错误的地方/您认为错误的原因/您收到的任何错误总是好的。有问题吗…?”,地球上的任何人怎么知道你面临的问题是什么。。陈述problem@forsvarir:因为有错误交叉线程:|请不要询问两次。如果您想改进、修改或添加原始问题,您应该对其进行编辑。@Cody Gray:这是新代码,最后一个问题没有解决
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);
                    }
                }