2011-05-13 1 views
0

내 생각에이 메시지를 다운로드 한 다음 ListView에 추가하면됩니다. 그러나이 코드를 사용하면 매우 오래 기다리고 프로그램이 응답하지 않을 것입니다. 나 좀 도와 줄 수있어?이 작업을 멀티 스레딩하는 방법은 무엇입니까?

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; 

     try 
     { 
      messages = client.Folders[MailTree.SelectedNode.Text].Search("ALL", false); // Search mail in your choossen Folder 
      AmoutOfMail = messages.Count(); //Amout of Mail in this Folder           
      for (int i = 0; i < AmoutOfMail; i++) 
      { 
       mes = messages[i]; 

       SaveMail(mes); // dowload mes and store message 

       ListViewItem item = new ListViewItem(); 
       Mime m = EncodingMail(MailTree.SelectedNode.Text, mes); // read mes from place store message 
       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); 
      } 
     }           
     catch (Exception) 
     { }             
    } 
} 

답변

2

예.

Tasks library을보고 원하는 스레드를 다른 스레드로 옮기십시오.

Controls.InvokeRequired을 사용하여 콜백 코드를 다시 UI 스레드에 배치해야합니다. UI 스레드와 다른 스레드에서 UI를 수정해서는 안됩니다.

+0

여기에 크로스 스레드를 사용하는 방법은 무엇입니까? – giaosudau

관련 문제