none
vb轉C# code的問題.. RRS feed

  • 問題

  • Dear all:

                  我用vb.net用沒問題~可是轉C#後卻問題一堆...

                  像是在UpTextBoxUI()出現do..while無窮迴圈問題..為什麼vb裡面就不會呢?還是說C#這邊不是用do..while?

           

       vb code

    Code Snippet

    Private Sub btnAccept_Click(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles btnAccept.Click

            Dim myThread As New Thread(New ThreadStart(AddressOf AcceptConnection))
            myThread.Start()
        End Sub

     

    Private Sub AcceptConnection()

            Label.CheckForIllegalCrossThreadCalls = False
            Dim lngAcceptData As Long
            Try
                If mySocket Is Nothing Then Return
                lblMessage.Text += "開始接受用戶端連線,接收連線資料...." + vbCrLf
                Do
                    myAcceptSocket = mySocket.Accept()
                    Do
                        Dim bteAcceptData(120) As Byte
                        lngAcceptData = myAcceptSocket.Receive(bteAcceptData)
                        If lngAcceptData > 0 Then
                            lblMessage.Text += "接收了 " + _
                                lngAcceptData.ToString + " 個位元組的資料 !!" + vbCrLf
                            txtContent.Text += Encoding.Default.GetString(bteAcceptData)
                        Else
                            Exit Do
                        End If
                    Loop
                Loop
            Catch ex As SocketException
                MessageBox.Show(ex.Message)
            End Try
        End Sub

     

    C# code

    Code Snippet

    private void button1_Click(object sender, EventArgs e)
            {
                Thread listenThread = new Thread(new ThreadStart(AcceptConnection));
                Thread.Sleep(500);
                listenThread.Start();
            }

     

    private void AcceptConnection()
            {
                MethodInvoker MI = new MethodInvoker(this.UpTextBoxUI);
                this.BeginInvoke(MI, new object[] { listData });
            }

     

            private void UpTextBoxUI()
            {
                long lngAcceptData;
                try
                {
                    myAcceptSocket = mySocket.Accept();
                    do
                    {
                        byte[] bteAcceptData = new Byte[256];
                        lngAcceptData = myAcceptSocket.Receive(bteAcceptData);
                        if (bteAcceptData.Length > 0)
                        {
                            textBox1.Text += Encoding.Default.GetString(bteAcceptData);
                        }
                    }
                    while (true);
                }
                catch (SocketException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

     

     

     

    2007年4月29日 上午 06:51

所有回覆

  • HI,

     

    您是不是自己寫漏了:

     

    if (bteAcceptData.Length > 0)
      {
          textBox1.Text += Encoding.Default.GetString(bteAcceptData);
      }

    else

    {

        break;

    }

     

    tihs

    2007年4月29日 上午 07:19
  • Dear tihs:

                    還是不行耶..因為if ( bteAcceptData.Length > 0 )所以都不會跳到else裡面阿...

    2007年4月29日 上午 09:21
  • private void button1_Click(object sender, EventArgs e)
            {
                Thread listenThread = new Thread(new ThreadStart(AcceptConnection));
                Thread.Sleep(500);
                listenThread.Start();
            }

     

    private void AcceptConnection()
            {
                MethodInvoker MI = new MethodInvoker(this.UpTextBoxUI);
                this.BeginInvoke(MI, new object[] { listData });
            }

     

            private void UpTextBoxUI()
            {
                long lngAcceptData;
                try
                {
                    myAcceptSocket = mySocket.Accept();
                    do
                    {
                        byte[] bteAcceptData = new Byte[256];
                        lngAcceptData = myAcceptSocket.Receive(bteAcceptData);
                        if (bteAcceptData.Length > 0)
                        {
                            textBox1.Text += Encoding.Default.GetString(bteAcceptData);
                        }
                    }
                    while (true);
                }
                catch (SocketException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

     

    你的Code 邏輯就怪怪的

    1.  lngAcceptData 好像沒用到.

    2.do   while (true) 是無限回圈,而在這裡你的 Code 好像也不用做 do while 的動作.
               

    2007年4月29日 下午 01:08
  • Dear 好說:

                       因為我在做類似像msn可以一直收到別人傳送過來的訊息,不過我現在問題轉為畫面會被其他資源占用無法使用,不知道為什麼vb不會有這樣問題,但在C#卻會這樣...我在第2個while裡面加了break這樣收到訊息後就可以跳脫無窮迴圈問題,但是又回到第一個while後因為Accept又開始等待收訊息~那這樣子要怎寫才不會讓UI畫面無法使用而其他的功能還可以運作?

     

    剛忘了補充~lngAcceptData是有用的

         

         

    Code Snippet

           private void Form1_Load(object sender, EventArgs e)
            {
                //建立接收的Thread
                Thread listenThread = new Thread( new ThreadStart( AcceptConnection ) );
                Thread.Sleep(1000);
                listenThread.Start();
             }

     

           private void AcceptConnection()
            {
                MethodInvoker MI = new MethodInvoker(this.UpTextBoxUI);
                this.BeginInvoke(MI, new object[] { listData });
            }

     

           private void UpTextBoxUI()
            {
                long lngAcceptData;
                try
                {
                    while(true)
                    {
                        myAcceptSocket = mySocket.Accept();
                        while(true)
                        {
                            byte[] bteAcceptData = new Byte[256];
                            lngAcceptData = myAcceptSocket.Receive( bteAcceptData );
                            if ( bteAcceptData.Length > 0 )
                            {
                                textBox1.Text += Encoding.Default.GetString( bteAcceptData );
                            }
                            break;
                        }
                    }
                }
                catch (SocketException ex)
                {
                    MessageBox.Show(ex.Message);
                }            }
                catch (SocketException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

     

     

    2007年4月29日 下午 01:34
  • If lngAcceptData > 0 Then

     

     if ( bteAcceptData.Length > 0 )

    上面這二行不一樣,結果當然不一樣.

    2007年4月29日 下午 01:42
  • 那請問好說大大~那該怎麼寫呢?

    若拿掉.Length的話要怎麼判斷有大於0?

     

    錯誤 1 無法將運算子 '>' 套用至型別 'byte[]' 和 'int' 的運算元

    2007年4月29日 下午 02:03
  • 1. 

    If lngAcceptData > 0 Then

     

     if ( bteAcceptData.Length > 0 )

    你覺得這二行有一樣嗎? 上面是VB 的寫法,下面是c#的寫法,你轉過來時不一樣當然不一樣.

    2.你 lngAcceptData 在Medoth 只有去接資料後就沒用到了.

    3.bteAcceptData.Length>0 你沒把長度設零,所以 if 永遠不會跳掉 Break 就不會執行.

    4.這是.net 一個問題,好像有接收長度的問題,我以前做是將 Long 去切成 Byte[//這裡好像只能int],然後回圈看 Long 是否全取完,再跳出.

    5.最後寫一堆 Socket 的 Code 越寫越多,越寫越大,瓶頸越多,決定了為了這小功能花這麼多時間沒意義,就上網找元件套比較快.

    2007年4月30日 上午 12:14