交叉线程问题?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);
}
}