none
[C#/2008] this.BeginInvoke 發生錯誤 RRS feed

  • 問題

  • 我有二個 From, 於 from1 程式段

    private void menuItem1_Click(object sender, EventArgs e)
            {
                using (frmControl fff = new frmControl())
                    fff.ShowDialog();
            }
    form2 有問題的程式段
                    this.BeginInvoke(new ServerInfo(this.ServerInfoMethod), new object[] { e });
                            this.BeginInvoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "xxx" });
    
    
     private delegate void ServerInfo(string value);
            private void ServerInfoMethod(string value)
            { 
                string[] strbuf = value.Split(new char[] { '|' });
    
                txtServerInfo.Text = "作業系統:\r\n" + strbuf[2] + "\r\n\r\n" +
                                     "記憶體:\r\n" + strbuf[3] + "\r\n\r\n" +
                                     "電腦名稱:\r\n" + strbuf[4] + "\r\n\r\n" +
                                     "使用者名稱:\r\n" + strbuf[5] + "\r\n\r\n" +
                                     "開機時間:\r\n" + strbuf[6];
            } 
    
     private delegate void AddListItem(string sDate, string sLocation, string sState, string sMsg);
    
            private void AddListItemMethod(string sDate, string sLocation, string sState, string sMsg)
    {
    xxxx
    }
    我的問題是... 第一次開啟 from2 時, 都沒有問題, 但是把 form2 關閉, 然後再開啟時 form2 時, 會於 this.BeginInvoke(new ServerInfo(this.ServerInfoMethod), new object[] { e }); 這段程式碼錯誤, 出現的錯誤訊息為 "ObjectDisposedException", 請問這是什麼問題呢? 要怎麼解決...

    工作環境:
    XP SP3, vs2008, Windows Mobile 6 Pro 模擬器 
    2009年9月30日 上午 06:52

解答

  • 問題解決了~

    在 form Closing 事件中, 加入
    Program.myTcp.DataIn -= new Class_Remote.EventHandler(this.tcpDataIn);
    Program.myTcp.EventChange -= new Class_Remote.EventHandler_eventchange(this.tcpEventChange);

    • 已標示為解答 linjr 2009年10月7日 下午 04:55
    2009年10月7日 下午 04:55

所有回覆

  • ObjectDisposedException
    你的Form2已經Disposed掉了.
    所以Form2要在new一次.
    2009年9月30日 上午 07:17
  • 但是我按下 form1 的 menuItem1_Click 這一個, form2 不是就會重新在 new 一次嗎??
    2009年9月30日 上午 07:19
  • txtServerInfo這個物件可能被Disposed.
    你用非同步設計樣是.你一個執行緒在背景處理中.你就把Form關掉.背景處理完畢回UI Thread時找不到txtServerInfo
    2009年9月30日 上午 07:44
  • 但是發生錯誤的時機是, 我再按下 form1 的 menuItem1_Click 時, 然後執行到 this.BeginInvoke 時才發生錯誤

    我把 this.BeginInvoke 改成 this.Invoke 也是發生一樣的錯誤

    我 form2 的流程式是...
    於 load 事件中, 啟動一個 thread, 跟另一台電腦連線讀取資料, 然後將資料顯示於 form2, 第一次執行 form1 的 menuItem1_Click 時都沒有問題, 關閉 form2 後, 再執行一次 form1 的 menuItem1_Click, 就會發生錯誤.

    2009年9月30日 上午 07:58
  • 單步執行,就知道哪裡被Disposed.

    2009年9月30日 上午 08:11
  • 不是很確定你整體的流程,你可以試一下在Form2的Form_Closeing事件中,明確加入this.dispose,看看是不是可以解決問題;Form.ShowDialog是以對話方塊的方式來顯示Form,而Dialog這個字眼是表示"他"是有回應值的,而為了要可以存取回應值,所以以ShowDialog方式叫出來的表單是不會不見的,你可以測試一下用showdialog之後在文字框裡面輸入一些資料,之後關閉,然後第二次開form2會看到輸入的字還會在。


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2009年9月30日 上午 08:47
    版主
  • 我於 form1 的 menuItem1_Click 內, 把程式碼改成
    form2 fff = new form2();
    fff.show();

    於 form2_Closing 事件中加入 this.Dispose();
    如果還是一樣, 也是在 this.BeginInvoke 這個地方發生錯誤.
    2009年9月30日 上午 09:11
  • 你的thread是在form2裡面掛上去的嗎?是的話在form2關閉有沒有做停止thread的動作?


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2009年9月30日 上午 09:13
    版主
  • 對, thread 在於 form2 內執行, 但是 thread 內沒有無限迴圈, 只執行一次... 而剛才試過了, 於 form2_Closing 事件中加入 myThread.Abort(); , 也一樣, 第二次執行 form1 的 menuItem1_Click , 都會發生錯誤
       
    private System.Threading.ThreadStart myThreadDelegate;
    private System.Threading.Thread myThread;
    
    private void frmControl_Load(object sender, EventArgs e)
    {
     myThreadDelegate = new System.Threading.ThreadStart(FirstLoop);
                myThread = new System.Threading.Thread(myThreadDelegate);
                myThread.Start();
    }
    2009年9月30日 上午 09:22
  • ObjectDisposedException 不是有內部例外.還有一些如堆疊...資訊?
    先打開來看將問題範圍縮小.再來處理.
    2009年9月30日 上午 09:31
  • 這是例外狀況資料

    System.ObjectDisposedException 未處理
      Message="ObjectDisposedException"
      ObjectName=""
      StackTrace:
        於 System.Windows.Forms.Control.InvokeHelper()
        於 System.Windows.Forms.Control.Invoke()
        於 門禁RemoteMobile.frmControl.tcpDataIn()
        於 門禁RemoteMobile.Class_Remote.Loop_Read()
      InnerException:
    2009年9月30日 上午 09:36
  • 你是做門禁的!
    你先把你的門禁功能關掉.先看是Form的問題,還是元件的問題.
    2009年9月30日 上午 09:40
  • Loop_Read裡面的code是長什麼樣子的呢?
    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2009年9月30日 上午 09:41
    版主
  • 我將我大部份的程式貼上來, 請幫我看一下...
    這程式碼有點多,有點亂.. 

    program.cs
    public static string ServerIP = "0.0.0.0";
            public static Int32 ServerPort = 5556;
            public static string LogonAcc = "";
            public static string LogonPW = "";
    
            public static Class_Remote myTcp = new Class_Remote();
    
    
    
    
            /// <summary>
            /// 應用程式的主要進入點。
            /// </summary>
            [MTAThread]
            static void Main()
            {
                Application.Run(new Form1());
            }
    form1.cs
    public Form1()
            {
                InitializeComponent();
            }
    
            private void menuItem2_Click(object sender, EventArgs e)
            {
                //
                //  設定
                //
                using (frmSetup fff = new frmSetup())
                    fff.ShowDialog();
    
                lblIP.Text = Program.ServerIP;
                lblPort.Text = Program.ServerPort.ToString();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //
                //  Load
                //
                string sPath;
                string sTemp;
                string[] strbuf;
    
                sPath = System.IO.Path.GetDirectoryName(System.IO.Path.GetDirectoryName(System.Reflection .Assembly.GetExecutingAssembly().GetName().CodeBase));
                sPath += "\\";
                sPath += "Server.dat";
    
                if (System.IO.File.Exists(sPath) == true)
                {
                    using (System.IO.StreamReader fs = new System.IO.StreamReader(sPath))
                    {
                        while (fs.Peek() > -1)
                        {
                            sTemp = fs.ReadLine().Trim();
                            if (sTemp == "") continue;
    
                            strbuf = sTemp.Split(new char[] { '=' });
                            if (strbuf.Length == 1) continue;
    
                            switch (strbuf[0].Trim().ToUpper())
                            {
                                case "IP": Program.ServerIP = strbuf[1].Trim(); break;
                                case "PORT": Program.ServerPort = Int32.Parse(strbuf[1].Trim()); break;
                                case "ACC": Program.LogonAcc = strbuf[1].Trim(); break;
                                case "PW": Program.LogonPW = strbuf[1].Trim(); break;
                            }
                        }
                    }
                }
               
    
                lblIP.Text = Program.ServerIP;
                lblPort.Text = Program.ServerPort.ToString();
            }
    
            private void menuItem1_Click(object sender, EventArgs e)
            {
                //
                //  連線
                //
                Program.myTcp.IP = Program.ServerIP;
                Program.myTcp.Port = Program.ServerPort;
    
                if (Program.myTcp.TcpConnect() == false)
                {
                    MessageBox.Show("無法連線至 " + Program.ServerIP + ":" + Program.ServerPort.ToString());
                    return;
                }
    
                frmControl fff = new frmControl();
                fff.Show();
            }
    
            private void Form1_Closing(object sender, CancelEventArgs e)
            {
                //
                //  Closing
                //
                Program.myTcp.Abort();
            }
    frmcontrol.cs   <- 這個就是我前面說的 form2
            private System.Threading.ThreadStart myThreadDelegate;
            private System.Threading.Thread myThread;
    
    
            private void FirstLoop()
            {
                string sTemp;
                byte iCount = 0;
                int T1 = 0;
    
                string[] strbuf;
    
    
                //---------------------------------------------------------
                //1. 連線
                this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "連線至Server" });
    
                
                //---------------------------------------------------------
                //2. 登入
                this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "登入Server" });
    
    
    
                //---------------------------------------------------------
                //3. Server Info
                this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "讀取 Server 電腦資訊" });
    
                sTemp = "xxx";
                Program.myTcp.Write(sTemp);
    
    
                //---------------------------------------------------------
                //4. 事件列表
                this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "讀取事件資料" });
    
                sTemp = "xxx";
                Program.myTcp.Write(sTemp);
    
    
                //---------------------------------------------------------
                //5. 主機列表
                this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "取得主機資料" });
    
                sTemp = "xxx";
                Program.myTcp.Write(sTemp);
    
    
    
                this.Invoke(new ButtonEnable(this.ButtonEnableMethod), new object[] { true });
            }
    
    
    
    
    
            //=====================================================================================================
            
            private void tcpEventChange(Class_Remote.enum_err e)
            {
                switch (e)
                {
                    case  Class_Remote.enum_err.Test:
                        Program.myTcp.Write("xxx");
                        break;
                    case Class_Remote.enum_err.ReadErr:
                        break;
                    default:
                        this.Close();
                        break;
                }
            }
    
            private void tcpDataIn(string e)
            {
                string[] strbuf = e.Split(new char[] { '|' });
    
                if (strbuf.Length == 1)
                    return;
                
                switch (strbuf[1].Trim().ToUpper())
                { 
                    case "PCINFO":      ***第二次開啟時,下面這一行就會發生錯誤***
                        this.Invoke(new ServerInfo(this.ServerInfoMethod), new object[] { e });
                        this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "載入Server資訊完成" });
                        break;
    
                    case "ENGINELIST":
                        this.Invoke(new EngineList(this.EngineListMethod), new object[] { e });
                        this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), "", "", "載入主機列表完成" });
                        break;
    
                    case "STATE":   
                        this.Invoke(new DisplayDoorState(this.DisplayDoorStateMethod), new object[] { e });
                        break;
    
                    case "LOG":
                        this.Invoke(new AddListItem(this.AddListItemMethod), new object[] { DateTime.Now.ToString("MM/dd HH:mm"), strbuf[3], strbuf[4], strbuf[5] });
                        break;
                }
            }
    
    
    
    
    
    
    
            //=====================================================================================================
    
            private delegate void AddListItem(string sDate, string sLocation, string sState, string sMsg);
            private void AddListItemMethod(string sDate, string sLocation, string sState, string sMsg)
            {
    			...略...
            }
    
    
            //按鍵 enable
            private delegate void ButtonEnable(bool value);
            private void ButtonEnableMethod(bool value)
            {
                if (_Power_OpenDoor ==true)
                    menuItem3.Enabled = value;
    
                if (_Power_Find==true)
                    menuItem4.Enabled = value;
            }
    
           
            private delegate void EngineList(string value);
            private void EngineListMethod(string value)
            {
    			...略...
            }
            
            
            private delegate void ServerInfo(string value);
            private void ServerInfoMethod(string value)
            { 
    			...略...
            } 
    
    
            private delegate void DisplayDoorState(string value);
            private void DisplayDoorStateMethod(string value)
            {
    			...略...
            } 
    
    
    
    
    
            
            
            
            //=====================================================================================================
    
    
            public frmControl()
            {
                InitializeComponent();
            }
    
            private void frmControl_Load(object sender, EventArgs e)
            {
                //
                //  Load
                //
    
                Program.myTcp.DataIn += new Class_Remote.EventHandler(this.tcpDataIn);
                Program.myTcp.EventChange += new Class_Remote.EventHandler_eventchange(this.tcpEventChange);
    
    
                menuItem3.Enabled = false;  
                menuItem4.Enabled = false;  
    
                myThreadDelegate = new System.Threading.ThreadStart(FirstLoop);
                myThread = new System.Threading.Thread(myThreadDelegate);
                myThread.Start();
            }
    
    
            private void frmControl_Closing(object sender, CancelEventArgs e)
            {
                //
                //  Closing
                //
                long T1 = System.Environment.TickCount;
    
                TCP_BYE = "";
                Program.myTcp.Write("xxx");
                while (true)
                {
                    System.Windows.Forms.Application.DoEvents();
                    System.Threading.Thread.Sleep(1);
    
                    if ((System.Environment.TickCount - T1) > 5000)
                        break;
    
                    if (TCP_BYE != "") break;
                }
    
                Program.myTcp.Close();
    
                myThread.Abort();
    
                this.Dispose();
            }
    


    class_remote.cs 內的 loop_read 程式碼
     /// <summary>
            /// 接收輪詢
            /// </summary>
            private void Loop_Read()
            {
                byte[] buffer = new byte[1024];
                int lll=0;
                int index;
                byte[] bbb;
    
                while (_ExitLoop == false)
                {
                    System.Windows.Forms.Application.DoEvents();
                    System.Threading.Thread.Sleep(1);
    
                    if (_isConnect == false) continue;
    
                    try
                    {
                        if (myTcp.GetStream().DataAvailable == false)
                        {
                            if (DateDiff(DateInterval.Minute, _recDate, DateTime.Now) > 2)
                            {
                                if (_TryCount >= 3)
                                {
                                    _isConnect = false;
                                    _recDate = DateTime.Now;
                                    this.event_EventChange(enum_err.TimeOut);
                                }
                                else
                                {
                                    _TryCount++;
                                    _recDate = DateTime.Now;
                                    this.event_EventChange(enum_err.Test);
                                }
                            }
                            continue;
                        }
                            
                        lll = myTcp.GetStream().Read(buffer, 0, buffer.Length);
                    }
                    catch (Exception)
                    {
                        continue;
                    }
    
                    for (index = 0; index < lll; index++)
                    {
                        switch (buffer[index])
                        {
                            case 0x0D:  //開始
                                if (bufferData.Length > 0) bufferData.Remove(0, bufferData.Length);
                                break;
                            case 0x0A:  //結束
                                if (bufferData.Length == 0)
                                    break;
    
                                bbb = Convert.FromBase64String(bufferData.ToString());
                                DataIn(System.Text.Encoding.Unicode.GetString(bbb, 0, bbb.Length));
                                bufferData.Remove(0, bufferData.Length);
                                break;
                            default:
                                try
                                {
                                    bufferData.Append(Convert.ToChar(buffer[index]));
                                }
                                catch (Exception)
                                {
                                    if (bufferData.Length > 0) bufferData.Remove(0, bufferData.Length);
                                }
                                break;
                        }
                    }
    
                    _recDate = DateTime.Now;
                }
    
    
    
            }
    












    2009年9月30日 下午 12:02
  • 沒有什麼功能... 目前就只有用 PDA 跟電腦傳一些字串而以, 再將串字解析然後顯示在PDA上面而以..
    2009年9月30日 下午 12:05
  • 1.很認真的人.
    2.很傳統的做法.
    3.很複雜的程式.
    看了頭痛.所以讓專業人士去解.
    沒錯,問題就在裡面.程式越複雜,出錯率越高,也越不容易解.
    2009年9月30日 下午 12:25
  • 請問關於您說的第2點, 請問有更好的做法嗎?? 可以給個方向嗎?
    2009年9月30日 下午 12:28
  • 這結合很多專業跟技術.
    1.OO你要很清楚.把一推雜構改成很漂亮.小小的Class.
    2.你要對事件通知非常的熟.我寫網路不用輪詢的方式.我是將資料丟到Server.等事件回應就好了.
    3.研究一下WCF吧!這個東西可以減少很多網路程式的問題.
    2009年9月30日 下午 12:58
  • 看的頭有點昏...orz
    Program.myTcp.Close();這段裡面做了什麼?

    this.Invoke(new ServerInfo(this.ServerInfoMethod), new object[] { e });  ServerInfo的定義是在哪邊?

    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2009年9月30日 下午 01:24
    版主
  • Program.myTcp.Close();看起來很單純.就是把Tcp連線關掉.
    ServerInfo 在樓頂.就是將電腦資訊印出.
    但全部合在一起就會花掉.
    2009年9月30日 下午 01:34
  • 因為myTcp看起來是他自己做的類別,我不確定他Close裡面做了什麼動作;而如果是把Tcp關掉,我沒看到他有去重新New Tcp的動作


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2009年9月30日 下午 01:38
    版主
  • 如果是 renew的話,我倒不認為問題在那裡.因為Form有renew所以所有資源會在配一次.
    而沒有Close()的話,資源會被吃完.因為他是unmanaged Code.所有像網路連線.檔案,資料庫..外部資源一定要Close();
    但錯誤訊又是Disposed.反正看到那麼多迴圈,我就懶得去分析.這種Code看多傷細胞.幸好不是遞回.不然就更辛苦.
    2009年9月30日 下午 01:46
  • 補上 class_remote 類別...
    我本來把三個程式檔, 分成三個程式段, 但是確定送出後, 全部都合在一起了~~  = =|||

    private System.Net.Sockets.TcpClient myTcp;
    
            private string _IP = "";
            private Int32 _Port = 5000;
    
            private bool _isConnect = false;
    
            private System.Text.StringBuilder bufferData = new StringBuilder();
    
            private bool _ExitLoop = false;
            private byte _TryCount = 0;
    
            private DateTime _recDate;
    
    
            private System.Threading.ThreadStart myThreadDelegate;
            private System.Threading.Thread myThread;
    
    
            //============================================================================================
            public enum enum_err : byte
            {
                TimeOut = 0,
                WriteErr = 1,
                ReadErr = 2,
                LogonOut = 3,
                Test = 4
            };
    
            enum DateInterval
            {
                Second, Minute, Hour, Day, Week, Month, Quarter, Year
            }
    
    
            //============================================================================================
            private long DateDiff(DateInterval arg_Interval, DateTime arg_StartDate, DateTime arg_EndDate)
            {
                long lngDateDiffValue = 0;
                System.TimeSpan objTimeSpan = new System.TimeSpan(arg_EndDate.Ticks - arg_StartDate.Ticks);
    
                switch (arg_Interval)
                {
                    case DateInterval.Second:
                        lngDateDiffValue = (long)objTimeSpan.TotalSeconds;
                        break;
                    case DateInterval.Minute:
                        lngDateDiffValue = (long)objTimeSpan.TotalMinutes;
                        break;
                    case DateInterval.Hour:
                        lngDateDiffValue = (long)objTimeSpan.TotalHours;
                        break;
                    case DateInterval.Day:
                        lngDateDiffValue = (long)objTimeSpan.TotalDays;
                        break;
                    case DateInterval.Week:
                        lngDateDiffValue = (long)(objTimeSpan.TotalSeconds / (7 * 24 * 60 * 60)); //一個星期7天
                        break;
                    case DateInterval.Month:
                        lngDateDiffValue = (long)(objTimeSpan.TotalSeconds / (30 * 24 * 60 * 60)); //一個月計30天
                        break;
                    case DateInterval.Quarter:
                        lngDateDiffValue = (long)(objTimeSpan.TotalSeconds / (90 * 24 * 60 * 60)); //一季計3月
                        break;
                    case DateInterval.Year:
                        lngDateDiffValue = (long)(objTimeSpan.TotalSeconds / (365 * 24 * 60 * 60));   //一年計365天
                        break;
                }
                return (lngDateDiffValue);
            }
    
    
            //============================================================================================
    
            public delegate void EventHandler(string e); 
            public event EventHandler DataIn;
            
            public void tcpDataIn()
            {
                if (DataIn != null)
                {
                    DataIn(bufferData.ToString());
                }
            }
    
            public delegate void EventHandler_timer();
            public event EventHandler_timer TcpTimer;
    
            public void event_Timer()
            {
                if (TcpTimer != null)
                    TcpTimer();
            }
    
            public delegate void EventHandler_eventchange(enum_err e);
            public event EventHandler_eventchange EventChange;
    
            public void event_EventChange(enum_err e)
            {
                if (EventChange != null)
                    EventChange(e);
            }
    
    
    
        
            
    
            //============================================================================================
            
            /// <summary>
            /// Server IP
            /// </summary>
            public string IP
            {
                get { return _IP; }
                set { _IP = value; }
            }
    
            /// <summary>
            /// Server Port
            /// </summary>
            public Int32 Port
            {
                get { return _Port; }
                set { _Port = value; }
            }
    
            /// <summary>
            /// Server is connect
            /// </summary>
            public bool IsConnect
            {
                get { return _isConnect; }
            }
    
    
    
    
    
    
            //============================================================================================
    
            /// <summary>
            /// 初始化
            /// </summary>
            public Class_Remote()
            {
                myThreadDelegate = new System.Threading.ThreadStart(Loop_Read);
                myThread = new System.Threading.Thread(myThreadDelegate);
                myThread.Start();
            }
    
    
    
            /// <summary>
            /// 開始輪詢
            /// </summary>
            public bool TcpConnect()
            {
                _isConnect = false;
                myTcp = new System.Net.Sockets.TcpClient();
                try
                {
                    myTcp.Connect(System.Net.IPAddress.Parse(_IP), _Port);
                }
                catch (Exception)
                {
    
                    return false;
                }
                _isConnect = true;
                _recDate = DateTime.Now;
                _TryCount = 0;
                return true;
            }
    
    
            /// <summary>
            /// 送出資料
            /// </summary>
            /// <param name="sData"></param>
            public void Write(string sData)
            {
                if (_isConnect == false) return;
    
                byte[] bbb;
                string sTemp;
    
                sTemp = Convert.ToChar(0x0D) + System.Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(sData.Replace("|", "").Length.ToString() + sData)) + Convert.ToChar(0x0A);
                bbb = System.Text.Encoding.ASCII.GetBytes(sTemp);
    
                try
                {
                    myTcp.GetStream().Write(bbb, 0, bbb.Length);
                }
                catch (Exception)
                {
                    _isConnect = false;
                    this.event_EventChange(enum_err.WriteErr);
                }
            }
    
            
            /// <summary>
            /// 中斷連線
            /// </summary>
            public void Close()
            {
                _isConnect = false;
                myTcp.Close();
            }
    
    
            public void Abort()
            {
                _ExitLoop = true;
                myThread.Abort();
            }
    
    
    
    
    
    
    
            /// <summary>
            /// 接收輪詢
            /// </summary>
            private void Loop_Read()
            {
                byte[] buffer = new byte[1024];
                int lll=0;
                int index;
                byte[] bbb;
    
                while (_ExitLoop == false)
                {
                    System.Windows.Forms.Application.DoEvents();
                    System.Threading.Thread.Sleep(1);
    
                    if (_isConnect == false) continue;
    
                    try
                    {
                        if (myTcp.GetStream().DataAvailable == false)
                        {
                            if (DateDiff(DateInterval.Minute, _recDate, DateTime.Now) > 2)
                            {
                                if (_TryCount >= 3)
                                {
                                    _isConnect = false;
                                    _recDate = DateTime.Now;
                                    this.event_EventChange(enum_err.TimeOut);
                                }
                                else
                                {
                                    _TryCount++;
                                    _recDate = DateTime.Now;
                                    this.event_EventChange(enum_err.Test);
                                }
                            }
                            continue;
                        }
                            
                        lll = myTcp.GetStream().Read(buffer, 0, buffer.Length);
                    }
                    catch (Exception)
                    {
                        continue;
                    }
    
                    for (index = 0; index < lll; index++)
                    {
                        switch (buffer[index])
                        {
                            case 0x0D:  //開始
                                if (bufferData.Length > 0) bufferData.Remove(0, bufferData.Length);
                                break;
                            case 0x0A:  //結束
                                if (bufferData.Length == 0)
                                    break;
    
                                bbb = Convert.FromBase64String(bufferData.ToString());
                                DataIn(System.Text.Encoding.Unicode.GetString(bbb, 0, bbb.Length));
                                bufferData.Remove(0, bufferData.Length);
                                break;
                            default:
                                try
                                {
                                    bufferData.Append(Convert.ToChar(buffer[index]));
                                }
                                catch (Exception)
                                {
                                    if (bufferData.Length > 0) bufferData.Remove(0, bufferData.Length);
                                }
                                break;
                        }
                    }
    
                    _recDate = DateTime.Now;
                }
    
    
    
            }
    2009年9月30日 下午 01:47
  • 問題解決了~

    在 form Closing 事件中, 加入
    Program.myTcp.DataIn -= new Class_Remote.EventHandler(this.tcpDataIn);
    Program.myTcp.EventChange -= new Class_Remote.EventHandler_eventchange(this.tcpEventChange);

    • 已標示為解答 linjr 2009年10月7日 下午 04:55
    2009年10月7日 下午 04:55