Avatar billede rekun Nybegynder
11. februar 2011 - 11:23 Der er 10 kommentarer

Problemer med threads

Hej allesammen

Jeg sidder og er helt ny i C#, men har alligevel kastet mig ud i noget med threads og Netværkskommunikation.

Jeg bruger denne kode til at sende beskeder til min server:

        public string senddata(string data, string IP)
        {
            string result;
            result = "fisk";
            try
            {             
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(new IPEndPoint(IPAddress.Parse(IP), 4217));
                stream = new NetworkStream(socket);
                reader = new StreamReader(stream);
                writer = new StreamWriter(stream);

                writer.Write(data + "\r\n");
                writer.Flush();
                result = reader.ReadLine();

                reader.Close();
                writer.Close();
                socket.Close();
            }
            catch (Exception fejl)
            {           
            }
            return result;
        }

Men da der nogle gange skal sendes mange beskeder samtidig(dog max 6), går det nogengange lidt langsomt, og der kan godt gå 2-3 sek inden det bliver modtaget.

Det skyldes så vidt jeg har forstået, at programmet kun kan sende en besked af gangen. Derfor har jeg forsøgt mig med at bruge threads til at sende med.

Det gør jeg med denne kommando:
        public void senddatathread(string data, string IP)
        {
            Thread t = new Thread ( () => senddata (data, IP) );
            t.Start();
        }

Dette virker for det meste, men skal der sendes mange beskeder hurtigt, så er det tit at ikke alle pakkerne når frem.

Er der nogen som evt sidder med en løsning?
Avatar billede mcb2001 Nybegynder
11. februar 2011 - 11:34 #1
Du skal overveje om serveren i den anden ende også kører tråde, for ellers modtager den jo blot én af gangen istedet for 6 af gangen.
Avatar billede bvli Praktikant
11. februar 2011 - 13:47 #2
I første omgang skal du ihvertfald nok gøre et elelr andet i din tomme catch. For det kunne jo være at du fik et svar på, hvorfor noget går galt - netop her.

En anden ting er, at du måske skulle kigge lidt på System.Threading.Tasks. Den bruger threads fra din thread pool, og det er noget billigere end at starte en ny thread op hver gang (især til så små sager, som du bruger thread'en til her).
Avatar billede rekun Nybegynder
11. februar 2011 - 18:12 #3
>>>>mcb2001, det burde ikke være noget problem med serveren, da den allerede kører i en thread, samt at alle beskederne sendes til forskellige servere

>>>>bvli, jeg vil prøve begge dine forslag her til aften
Avatar billede rekun Nybegynder
11. februar 2011 - 20:02 #4
Jeg kan desværre ikke få det til at virke :/

poster lige serverdelen også:

        static void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            Class1 objIP;
            objIP = new Class1();

            done = false;
            Socket serverSocket = null;
            Socket socket = null;
            NetworkStream stream = null;
            StreamWriter writer = null;
            StreamReader reader = null;
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(IPAddress.Any, 4218));
            serverSocket.Listen(0);
            while (done == false)
            {
                socket = serverSocket.Accept();
                stream = new NetworkStream(socket);
                reader = new StreamReader(stream);
                writer = new StreamWriter(stream);
                queryString = reader.ReadLine();
                string result;
                result = "OK";
                writer.Write(result);
                writer.Flush();
                reader.Close();
                reader = null;
                writer.Close();
                writer = null;
                socket.Close();
                socket = null;
                done = true;
                serverSocket.Close();
            }
            e.Result = queryString;    // This gets passed to RunWorkerCompleted
        }

Kan det være noget med at denne kommando:
queryString = reader.ReadLine();
bliver udført inden den har modtaget hele beskeden/kun modtager noget af beskeden.
Avatar billede arne_v Ekspert
11. februar 2011 - 20:55 #5
Den server kode er single threaded, så hvis det er samme server, så processes dat sekventielt.
Avatar billede arne_v Ekspert
11. februar 2011 - 20:56 #6
Man bruger ikke:

foobar = null;

i C# da C# GC bruger reachability ikke reference count.
Avatar billede rekun Nybegynder
11. februar 2011 - 20:57 #7
Det har du ret i, men der bliver altid kun sendt en besked til hver server af gangen.

Så hvis der skal sendes 6 beskeder, så er det også til 6 forskellige servere..

bruger jeg den metode bvli foreslår med system.threading.task så er det endnu mindre så når frem til serveren
Avatar billede arne_v Ekspert
13. februar 2011 - 00:50 #8
Er du sikker på at beskederne når sent frem og at det ikek er visningen af dem der er forsinket?
Avatar billede rekun Nybegynder
14. februar 2011 - 07:54 #9
Nej er ikke sikker, men enden kommer beskederne med det samme, ellers komme de aldrig, uanset hvor længe vi vendter
Avatar billede spaceus Nybegynder
11. april 2011 - 22:56 #10
print din fejl ud så den ikke gemmer sig i din exception

prøv evt. at bruge ReadToEnd() istedet for ReadLine()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester