Wielowątkowość i pobieranie wiadomości z konta e-mail

0

Witam, postanowiłem dodać do swojego klienta pocztowego wielowątkowość, jednakże nie działa ona tak jakbym chciał, za każdym razem odmawia pobrania wiadomości. Oto kod przycisku którym inicjuję owe pobieranie:

             
            Thread pobieranie = new Thread(pobieranieMaili);
            
            if (pobieraWiadomosci == true)
            {}
            else
            {
                pobieranie.Start();
            }

Gwoli ścisłości, pobieraWiadomosci to zmienna "globalna" typu bool którą określam czy klient pobiera wiadomości czy też nie.

0

myślę, że przyczyną są plamy na słońcu oraz, tak ostatnio popularne, globalne ocieplenie...

0

Domyślam się, że chodzi Ci o brak funkcji pobierającej wiadomości - oto i ona (dość obszerna):

        private void pobieranieMaili()
        {
            string path = Application.StartupPath;
            try
            {
                pobieraWiadomosci = true;
                List<odczyt> listaMaili = new List<odczyt>();
                int licznik = 0;

                XmlSerializer x = new XmlSerializer(typeof(List<ustawienia>));
                FileStream f = new FileStream(path + @"\data.xml", FileMode.Open);
                List<ustawienia> sett = (List<ustawienia>)x.Deserialize(f);
                f.Close();

                sett.ForEach(delegate(ustawienia ust)
                {
                    //prepare pop client
                    // TODO: Replace server address, username and password with your own credentials.
                    Pop3.Pop3MimeClient DemoClient = new Pop3.Pop3MimeClient(ust.adresPop3, Convert.ToInt32(ust.portPop3), ust.ssl, ust.nazwaUzytkownika, ust.haslo);

                    DemoClient.Trace += new TraceHandler(Console.WriteLine);
                    DemoClient.ReadTimeout = 60000; //give pop server 60 seconds to answer

                    //establish connection
                    DemoClient.Connect();

                    //get mailbox stats
                    int numberOfMailsInMailbox, mailboxSize;
                    DemoClient.GetMailboxStats(out numberOfMailsInMailbox, out mailboxSize);

                    //get at most the xx first emails
                    RxMailMessage mm;
                    int downloadNumberOfEmails;
                    toolStripProgressBar1.Maximum = numberOfMailsInMailbox;
                    int maxDownloadEmails = 99;
                    if (numberOfMailsInMailbox < maxDownloadEmails)
                    {
                        downloadNumberOfEmails = numberOfMailsInMailbox;
                    }
                    else
                    {
                        downloadNumberOfEmails = maxDownloadEmails;
                    }
                    for (int i = 1; i <= downloadNumberOfEmails; i++)
                    {
                        DemoClient.GetEmail(i, out mm);
                        if (mm == null)
                        {
                            //Console.WriteLine("Email " + i.ToString() + " cannot be displayed.");
                        }
                        else
                        {
                            toolStripProgressBar1.Value = i;
                            listaMaili.Add(new odczyt(Convert.ToString(mm.From), Convert.ToString(mm.To), mm.Subject, mm.Body, Convert.ToString(mm.DeliveryDate)));
                            toolStripStatusLabel1.Text = "Pobieranie wiadomości z konta: " + Convert.ToString(mm.To) + " (" + i + "/" + numberOfMailsInMailbox + ")";
                            ++licznik;
                            toolStrip1.Refresh();

                            if (mm.Attachments.Count > 0)
                                for (int AttachmentNo = 0; AttachmentNo < mm.Attachments.Count; AttachmentNo++)
                                {
                                    //get stream of attachment
                                    Stream attachmentStream = mm.Attachments[AttachmentNo].ContentStream;
                                    //open a file stream to write attachment

                                    string path1 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\" + ust.nazwaUzytkownika + " " + mm.Attachments.ElementAt(AttachmentNo).Name;
                                    using (FileStream writeFileStream = new FileStream(path1, FileMode.Create, FileAccess.Write))
                                    {
                                        int bytesCopied;
                                        //create a byte buffer big enough to hold the email attachment stream
                                        byte[] attachmentByteBuffer = new byte[(int)attachmentStream.Length];
                                        //position at the beginning of the email attachment stream
                                        attachmentStream.Seek(0, SeekOrigin.Begin);
                                        //copy the attachment to the byte array
                                        bytesCopied = attachmentStream.Read(attachmentByteBuffer, 0, attachmentByteBuffer.Length);
                                        if (bytesCopied != attachmentByteBuffer.Length)
                                        {
                                            throw new ApplicationException("Tried to copy " + attachmentByteBuffer.Length.ToString() +
                                              " bytes from attachment, but received " + bytesCopied.ToString() + " bytes instead.");
                                        }
                                        //write byte array to file
                                        writeFileStream.Write(attachmentByteBuffer, 0, bytesCopied);
                                    }
                                }
                            DemoClient.DeleteEmail(i);
                        }
                    }

                    //close connection
                    DemoClient.Disconnect();

                    int seek = ust.adresSmtp.IndexOf(".");
                    string andDestroy = ust.adresSmtp.Remove(0, ++seek);

                    ust.nazwaUzytkownika = ust.nazwaUzytkownika + "@" + andDestroy;

                    if (File.Exists(path + @"\" + ust.nazwaUzytkownika + "maile.xml"))
                    {
                        XmlSerializer c = new XmlSerializer(typeof(List<odczyt>));
                        FileStream d = new FileStream(path + @"\" + ust.nazwaUzytkownika + "maile.xml", FileMode.Open);
                        List<odczyt> listaStarychMaili = (List<odczyt>)c.Deserialize(d);
                        d.Close();

                        for (int i = 0; i < listaMaili.Count; i++)
                            listaStarychMaili.Add(new odczyt(listaMaili.ElementAt(i).nadawca, listaMaili.ElementAt(i).odbiorca, listaMaili.ElementAt(i).temat, listaMaili.ElementAt(i).tresc, listaMaili.ElementAt(i).data));

                        XmlSerializer oSerializer = new XmlSerializer(typeof(List<odczyt>));
                        StreamWriter oStreamWriter = new StreamWriter(path + @"\" + ust.nazwaUzytkownika + "maile.xml");
                        oSerializer.Serialize(oStreamWriter, listaStarychMaili);
                        oStreamWriter.Dispose();
                    }
                    else
                    {
                        XmlSerializer oSerializer = new XmlSerializer(typeof(List<odczyt>));
                        StreamWriter oStreamWriter = new StreamWriter(path + @"\" + ust.nazwaUzytkownika + "maile.xml");
                        oSerializer.Serialize(oStreamWriter, listaMaili);
                        oStreamWriter.Dispose();
                    }

                    listaMaili.Clear();
                    toolStripProgressBar1.Value = 0;

                    pobieraWiadomosci = false;

                    if (licznik == 0)
                        toolStripStatusLabel1.Text = "Brak nowych wiadomości";
                    else
                        toolStripStatusLabel1.Text = "Jest " + Convert.ToString(licznik) + " nowych wiadomości";
                    
                });
            }
            catch (Exception)
            {
                toolStripStatusLabel1.Text = "Nie udało się pobrać wiadomości";
                pobieraWiadomosci = false;
            } 
0

"Domyślam się, że chodzi Ci o brak funkcji pobierającej wiadomości " między innymi. Dodatkowo stwierdzenie "jednakże nie działa ona tak jakbym chciał, za każdym razem odmawia pobrania wiadomości." nie jest zbyt dokładnym określeniem błędu. Zamień
catch (Exception)
{
toolStripStatusLabel1.Text = "Nie udało się pobrać wiadomości";
pobieraWiadomosci = false;
}

na
<code class="c#">            catch (Exception ex)
            {
                string s = "\r\n" + ex.Message;
                if (ex.InnerException!= null)
                  s += "\r\n" + ex.InnerException.Message;
                toolStripStatusLabel1.Text = "Nie udało się pobrać wiadomości" + s;
                pobieraWiadomosci = false;
            }

to będziesz chociaż wiedział co się wykrzacza

0

Już działa, chodziło o to że próbowałem z innego wątku uzyskać dostęp do zmiany pewnych wartości kontrolek, na co visual studio nie pozwala.

0
dejmien666 napisał(a)

Już działa, chodziło o to że próbowałem z innego wątku uzyskać dostęp do zmiany pewnych wartości kontrolek, na co visual studio nie pozwala.

Tak, to na pewno Visual Studio wina. [rotfl]

1 użytkowników online, w tym zalogowanych: 0, gości: 1