Jag håller på och gör en RSS reader där jag har en TreeView för att visa Folder, Channel och Items. Man kan alltså skapa Folders där man kan placera channels. Kolla in klassen BackgroundWorker i dokumentationen, där finns exempel hur du bör gå till väga. Tack för tipset. Kollade igenom dokumentationen och testade en implimentation av deras DoWork och RunWorkerCompleted events. Du försöker fortfarande uppdatera en kontroll (progressbar) från fel tråd. Lyssna på eventet ProgressChanged från workern och uppdatera progressbaren i den eventhandlern. Eller, så kan du helt enkelt köra en invoke, Det kanns som att detta kommer att ta evigheter att fa ordning pa sa jag vantar med det tills nasta version da jag kommer gora om allt fran scratch. Jag har sparat anteckningar fran diskussionen i alla fall och tackar alla som hjalpt till!Multi-threading problem
Jag har en metod (UpdateChannels) som uppdaterar alla rss-feeds och placerar dess Items i min databas. I slutet av den metoden så anropar den en annan metod (LoadTreeView) som bygger upp TreeView'n från databasen. Jag har också en Timer som anropar UpdateChannels() när den är nere på 0.
Detta funkar bra men...
Updateringsprocessen kan ta ett tag eftersom den kopplar upp sig mot RSS-feeden, plockar ut värden samt också uppdaterar en progressbar jag har längst nere i min Form.
Därför skulle jag vilja göra allt detta i en ny tråd så att användaren inte behöver sitta och vänta på allt utan att kunna göra nåt.
Jag antar att jag måste göra en ny tråd när timern kommer till 0 men jag har testat lite och jag får bara felmeddelanden:
"Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on." och har också fått:
"Action being performed on this control is being called from the wrong thread. Marshal to the correct thread using Control.Invoke or Control.BeginInvoke".
Så jag är inte riktigt säker på hur jag ska gå tillväga. Min UpdateChannels() uppdaterar lite labels på min Form och progressbaren och min LoadTreeView() uppdaterar också lite labels och så.
Någon som skulle kunna hjälpa mig?Sv: Multi-threading problem
Anledningen till att du får fel är att det inte är trådsäkert att uppdatera en kontroll från annan tråd än den som skapade kontrollen.Sv:Multi-threading problem
När timern är 0 kör jag en backgroundWorker1.RunWorkerAsync(); som startar min DoWork.
I min DoWork kör jag min UpdateChannels() och i RunWorkerCompleted kör jag LoadTreeView() om resultatet var ok.
Ta ta! Samma fel. Den klagar på raden
rssProgressBar.Maximum = channels.Channels.Count; (channels är en instans av klassen Channel som jag har i projektet).
Men jag tror att den klagar på progressbaren. Några fler förslag?
Felmeddelande: "Action being performed on this control is being called from the wrong thread. Marshal to the correct thread using Control.Invoke or Control.BeginInvoke"Sv: Multi-threading problem
Sv: Multi-threading problem
public delegate void Update(); // Funktionspekare, skall vara utanför klassen
public partial class Form1 : Form
{
Update FunctionPointer = new Update(UpdateProgress); // Deklarerar funktionspekaren
private void button1_Click(object sender, EventArgs e) // Skapar tråden
{
Thread t = new Thread(new ThreadStart(Anotherthread));
t.Start
}
private void Anotherthread()
{
rssProgressBar.Invoke(FunctionPointer); // Invoke, Uppdaterar kontrollen på denna tråd
}
private void UpdateProgress()
{
rssProgressBar.Maximum = channels.Channels.Count;
}
}
Skrivet direkt ur huvudet, så du behöver nog ändra lite :)
Sv:Multi-threading problem