Wiem, że podobny temat był już wiele razy. Wiem, bo wszystkie przeglądnąłem: i z 4programmers i ze Stacka. Ale w żaden sposób nie mogę otrzymać tego efektu, jaki chcę.
Mam program, który sprawdza ilość wiadomości na skrzynce pocztowej. Do programu wczytuję konta i klikam w przycisk "Sprawdź". Dla każdego konta tworzy mi się osobny wątek - funkcja, która loguje się na dane konto i zlicza wiadomości, wyświetlając przy tym komunikaty w kolumnie status (np. Łączenie, Logowanie, Zliczanie) i liczbę wiadomości w textboxie.
Po wciśnięciu Sprawdź wykonuje się:
private void buttonClick(object sender, EventArgs e)
{
for (int i = 0; i < mylistview.CheckedItems.Count; i++)
{
Thread thread = new Thread(() => messagesCheck(mylistview.CheckedItems[i]));
thread.Start();
}
}
a funkcja messagesCheck wygląda tak:
public void messagesCheck(ListViewItem row)
{
row.SubItems[2].Text = "Łączenie";
// funkcja do laczenia
row.SubItems[2].Text = "Logowanie";
// funkcja do logowania
row.SubItems[2].Text = "Sprawdzanie";
//funkcja do zliczania wiadomosci
textBox3.AppendText("Konto nr " + row.SubItems[0].Text + ": liczba wiadomosci = " + liczba);
}
I zaraz po uruchomieniu, w linijce:
Thread thread = new Thread(() => messagesCheck(mylistview.CheckedItems[i]));
otrzymuję komunikat:
Nieprawidłowa operacja między wątkami: do formantu 'mylistview' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony.
zależy mi na uruchomieniu fuknkcji messagesCheck w osobnych wątkach dla każdego konta. Bez tego okno do sprawdzania zacina się i wyniki sprawdzania w kolumnie "Status" pojawiają się dopiero po sprawdzeniu wszystkich kont (jednak w textboxie wiadomości pojawiają się na bieżąco, dlaczego???). Spróbowałem też tak:
private void buttonClick(object sender, EventArgs e)
{
Thread thread = new Thread(() => messagesCheck());
thread.Start();
}
public void messagesCheck()
{
mylistview.Invoke(new Action(delegate()
{
for (int i = 0; i < mylistview.CheckedItems.Count; i++)
{
row.SubItems[2].Text = "Łączenie";
// funkcja do laczenia
row.SubItems[2].Text = "Logowanie";
// funkcja do logowania
row.SubItems[2].Text = "Sprawdzanie";
//funkcja do zliczania wiadomosci
textBox3.AppendText("Konto nr " + row.SubItems[0].Text + ": liczba wiadomosci = " + liczba);
}
}));
}
Nie było błędu, ale wyniki pokazało dopiero na końcu, tak jak bez wykorzystania wątków.