[c#]Aiuto utilizzo thread

domenica 06 aprile 2008 - 14.07

program Profilo | Junior Member

Ciao,
ho creato due piccoli script un client un server e un oggetto.
I client inviano delle stringhe che il server prende e inserisce in un file (data.txt).

Da come credo di aver capito peroì in questo modo l'accesso al file ogni volta che un client lo richiede non è controllato e quindi potrebbe verificarsi una corruzione dei dati che vengono scritti nel file.

Ho letto quindi che si adotta l'utilizzo dei thread e della classe monitor per creare una coda (queue?) di processi che vengono svolti ogni qualvolta un thread ha finito di scrivere i dati sul file.

Mi potete fare aiutare a capire come realizzare cio'?

Qui ce l'esempio che sto svolgendo:
http://www.megafileupload.com/en/file/57862/remoting-zip.html

Codice:
Classe Oggetto:
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace MyRemotableType { public class MyRemotableType : MarshalByRefObject { private string path = "dati.txt"; public MyRemotableType() { Console.WriteLine("A New MarshalByRefObject created"); } public void write(string message) { if(!File.Exists(this.path)) { using (StreamWriter sw = new StreamWriter(this.path)) { // Add some text to the file. sw.Write("This is the "); sw.WriteLine("header for the file."); // Arbitrary objects can also be written to the file. sw.Write("The date is: "); sw.WriteLine(DateTime.Now); sw.WriteLine("The message is " + message); sw.WriteLine("-------------------"); sw.Close(); } }else { StreamWriter sw =File.AppendText(this.path); // Add some text to the file. sw.Write("This is the "); sw.WriteLine("header for the file."); // Arbitrary objects can also be written to the file. sw.Write("The date is: "); sw.WriteLine(DateTime.Now); sw.WriteLine(message); sw.WriteLine("-------------------"); sw.Close(); } } public string CaldSum(int a, int b) { return string.Format("Sum is: {0}", a + b); } } }

Client:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Server:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Grazie.

aiedail92 Profilo | Expert

Ciao

posso dirti in cosa consiste l'errore che ricevi, però non credo di poterti aiutare col resto

In pratica l'errore che viene fuori è dato dal fatto che quando crei un delegato (nel tuo caso un ThreadStart), l'unico argomento che puoi passare è il nome di un metodo, senza parentesi. Questo perchè un delegato è un tipo che fa riferimento ad un metodo, quindi i parametri li puoi passare solo quando invochi il delegato, non quando lo inizializzi.

Dunque per cancellare l'errore sostituisci

Thread workerThread = new Thread(new ThreadStart ( t.write("ciao") ) ); workerThread.Start();

Con

Thread workerThread = new Thread(new ParameterizedThreadStart(t.write)); workerThread.Start("ciao");

La funzione Start non fa altro che richiamare il metodo puntato dal delegato (quindi t.write) passando come argomento gli argomenti ad essa passati (quindi "ciao") sul thread specificato (quindi workerThread)

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5