Programarea in .NET - partea a 14-a Salvare XML si Executare de operatii asincrone in Windows Forms
Va rog sa folositi acest URL NOU
de la
http://serviciipeweb.ro/iafblog/
De ce taskuri asincrone ? In ideea ca , intr-o aplicatie Windows(si chiar ASP.NET) , operatiile lungi ar trebui sa fie executate de catre alt thread, urmind ca aplicatia sa poata sa mai afiseze ceva utilizatorulu in tot acest timp ( fie si un buton pe care scrie „apasa ca sa intrerupi operatia asta lunga ..."). De pilda, in aplicatia noastra, daca avem mai mult de 100 de Publisher-i si vrem sa ii vedem pe toti – ar trebui incarcati intr-un nou thread.
Ne ocupam mai intii de o aplicatie Windows Forms si pe urma de ASP.NET
Un thread nu e greu de pornit. Hai sa vedem un exemplu:
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(StartAction));
t.Start("obiect transmis");
public void StartAction(object o)
{
string s = o.ToString();
System.Threading.Thread.Sleep(5000);
//executa actiunea
//trimite text
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate()
{
this.Text = s;
});
//sau
//this.Invoke(new MethodInvoker(evenimentfaraparametri());
//this.Invoke(new EventHandler(btnDiscounts_Click));
//this.BeginInvoke(new EventHandler(eveniment cu parametri));
}
else
this.Text = s;
}
Totusi, exista o problema – dintr-un thread nu se pot accesa DIRECT controale din alt thread – si de aceea avem instructiunea this. Invoke .Diferenta intre this.Invoke si este this.BeginInvoke aceea ca prima instructiune asteapta rezultatul actiunii, pe cind a doua doar executa si se intoarce imediat sa execute codul ramas.
De aceea exista controlul numit BackgroundWorker – care asigura ca , din evenimentul propriu generat, sa accesezi orice obiect de pe forma. O sa facem acest lucru pentru salvarea in XML a colectiei de Publisher-i in format XML.
.NET are o forma usoara de a salva o colectie/clasa in format XML , salvindu-i proprietatile.
Vom utiliza modalitatea cea mai usoara de a face acest lucru
Marcam clasa Publisher si clasa colectie ColPublisher cu atributul de [Serializable] :
[Serializable]
public class ColPublisher : System.Collections.ObjectModel.KeyedCollection<string,Publisher>
[Serializable]
public class Publisher
Acum o sa facem serializarea obiectului Publisher:
#region Serializer
/// <summary>
/// instanta pentru lazy load
/// </summary>
private static XmlSerializer m_Serializer;
/// <summary>
/// serializator pentru obiectul publisher
/// </summary>
private static XmlSerializer Serializer
{
get
{
if (m_Serializer == null)
m_Serializer = new XmlSerializer(typeof(Publisher));
return m_Serializer;
}
}
/// <summary>
/// salveaza obiectul ca XML
/// </summary>
[XmlIgnore]
public string XML
{
get
{
StringBuilder sb = new StringBuilder();
EncodingStringWriter sw = new EncodingStringWriter(sb, Encoding.Default);
XmlTextWriter xtw = new XmlTextWriter(sw);
Serializer.Serialize(xtw, this);
return sb.ToString();
}
}
/// <summary>
/// recreeeaza un Publisher dintr-un string XML
/// </summary>
/// <param name="XML">string care contine tot </param>
/// <returns></returns>
public static Publisher FromXML(string XML)
{
StringReader sr = new StringReader(XML);
return Serializer.Deserialize(sr) as Publisher;
}
0 Comments:
Trimiteți un comentariu
<< Home