Solved

Sockets : application becomes very slow

Posted on 2004-10-19
9
221 Views
Last Modified: 2010-04-23
Hello,

I'm writing a PDA application in vb.net using the compact framework.  This application features a winsock listener to capture message from the host application.

The problem is : after receiving a message, my application becomes really slow.  Does anyone have a clue how this can be solved ?
0
Comment
Question by:ACAE
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 2
9 Comments
 
LVL 9

Expert Comment

by:checoo
ID: 12347285
can you post some code snippets...
0
 

Author Comment

by:ACAE
ID: 12347363
OK, here it comes :

I created as class called 'NavisionHost' :
----------------------------------------------
Imports System.Net.Sockets
Imports System.Text

Public Class NavisionHost
    Const READ_BUFFER_SIZE As Integer = 65536
    Private MyTCPClient As TcpClient
    Private readBuffer(READ_BUFFER_SIZE) As Byte

    Public Sub New(ByVal client As TcpClient)        
        Me.MyTCPClient = client

        ' This starts the asynchronous read thread.  The data will be saved into
        ' readBuffer.        
        ReDim readBuffer(READ_BUFFER_SIZE)
        Me.MyTCPClient.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, AddressOf StreamReceiver, Nothing)
    End Sub

    Public Event LineReceived(ByVal sender As NavisionHost, ByVal Data As String)

    Private Sub StreamReceiver(ByVal ar As IAsyncResult)
        Dim BytesRead As Integer
        Dim strMessage As String

        Dim liPosition As Integer = 0

        Try
            ' Ensure that no other threads try to use the stream at the same time.
            SyncLock MyTCPClient.GetStream
                ' Finish asynchronous read into readBuffer and get number of bytes read.
                BytesRead = MyTCPClient.GetStream.EndRead(ar)
            End SyncLock

            ' Convert the byte array the message was saved into, minus one for the
            ' Chr(13).
            If BytesRead > 0 Then
                strMessage = Encoding.ASCII.GetString(readBuffer, 0, BytesRead - 1)
                RaiseEvent LineReceived(Me, strMessage)
            End If

            ' Ensure that no other threads try to use the stream at the same time.
            SyncLock MyTCPClient.GetStream
                ' Start a new asynchronous read into readBuffer.
                MyTCPClient.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, AddressOf StreamReceiver, Nothing)
            End SyncLock
        Catch ex As Exception
        End Try
    End Sub
End Class

-----------------------
This class is used on the form that contains the listener :
-----------------------

 Private myTCPlistener As TcpListener
    Private myListenerThread As Threading.Thread = Nothing

'Enable listener
If Not (myListenerThread Is Nothing) Then
   myTCPlistener.Stop()
   myTCPlistener = Nothing
   myListenerThread = Nothing
End If
myListenerThread = New Threading.Thread(AddressOf  DoListen)
myListenerThread.Start()


Private Sub DoListen()        
StartDoListen:      
        Try
            If ucPublicInfo.LoggedOn And Not (ucPublicInfo.connIPAddress Is Nothing) Then
                If Not (myTCPlistener Is Nothing) Then
                    myTCPlistener.Stop()
                    myTCPlistener = Nothing
                End If
                myTCPlistener = New TcpListener(ucPublicInfo.connIPAddress, ucPublicInfo.iPortNum)
                myTCPlistener.Start()
                Do
                    If Not (ucNavisionHost Is Nothing) Then
                        ucNavisionHost = Nothing
                    End If
                    ucNavisionHost = New NavisionHost(myTCPlistener.AcceptTcpClient)

                    ' Create an event handler to allow the UserConnection to communicate
                    ' with the window.
                    AddHandler ucNavisionHost.LineReceived, AddressOf OnLineReceived
                Loop Until False
            End If
        Catch ex As Exception
          GoTo StartDoListen
        End Try
    End Sub

    Private Sub OnLineReceived(ByVal sender As NavisionHost, ByVal psdata As String)
        'In this procedure the received data (string containing XML document) is processed
        '....
    End Sub

Is this sufficient ?
0
 
LVL 27

Expert Comment

by:planocz
ID: 12348584
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 9

Accepted Solution

by:
checoo earned 500 total points
ID: 12354900
is your app becoming slow immediately after receiving the data or it becomes slow during the XML processing in OnLineReceived
0
 

Author Comment

by:ACAE
ID: 12355626
It becomes slow immediately after receiving the data.  I replaced the pocessing of the data with a simple messagebox and it remains slow.  Could it have something to do with the size of the receivebuffer ?
0
 

Author Comment

by:ACAE
ID: 12355782
Hi,

I hope this helps, I think I found the reason why it becomes slow but I don't know how to solve this.  
In the event 'streamreceiver' I replaced

If BytesRead > 0 Then
                strMessage = Encoding.ASCII.GetString(readBuffer, 0, BytesRead - 1)
                RaiseEvent LineReceived(Me, strMessage)
End If

with a messagebox, and this messagebox keeps showing on the PDA.  Do I need an endread or something ?

0
 

Author Comment

by:ACAE
ID: 12355789
Oops, just a bit too fast.  I have an endread just before the messagebox.  Then why does the message appear again ?
0
 

Author Comment

by:ACAE
ID: 12355854
Another bit of information that might help : the first time the event is called, 40 bytes are received, then always 0 (which is normal as there is nothing send)
0
 

Author Comment

by:ACAE
ID: 12367492
I found a solution : if bytesread is zero then i perform an exit sub.  This seems to be working for now.  Thanx for your help anyway.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Microsoft Reports are based on a report definition, which is an XML file that describes data and layout for the report, with a different extension. You can create a client-side report definition language (*.rdlc) file with Visual Studio, and build g…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question