2014-07-25 44 views
0

當設置我的套接字進行連接時,我把這個方法封裝在try-catch塊中..是否需要調用?

如果發生套接字異常,我創建一個新的線程..睡15秒..然後調用再次連接方法,但這次是從另一個線程。我這樣做主要是爲了睡眠方法(爲了避免使用定時器重新連接)不掛斷主線程。

總之..嘗試連接時,我寫的狀態,使用的方法稱爲寫()剛剛追加文本到當前文本與之前\ n它的文本框...

因爲在失敗的連接上,我創建了一個單獨的線程來調用connect方法(它修改表單上的一個控件),我正確使用方法調用的權限?

這裏是我的代碼

private void Connect() 
    { 
     try 
     { 
      Write("Connecting..."); 
      _ClientSocket.Connect(new IPEndPoint(IPAddress.Loopback, 2500)); 
      Connected = true; 
      Write("Connected."); 
      _ClientSocket.BeginReceive(Buffer, 0, Buffer.Length, 0, new AsyncCallback(RecieveCallBack), null); 
     } 
     catch (SocketException ex) 
     { 
      Write("Connection Failed. Trying again in 15 Seconds..."); 
      Connected = false; 
      new Thread(delegate() 
      { 
       Thread.Sleep(15000); 
       Invoke((MethodInvoker)delegate 
       { 
        this.Connect(); 
       }); 
      }).Start(); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

我只是想確保我在正確的方式

+1

測試肩d回答你的問題。它是否在沒有調用的情況下工作?它是否適用於調用?如果答案分別爲「否」和「是」,那麼看起來你已經做了正確的事情。如果答案是肯定的,那麼你不需要調用。 – Chris

+0

你的UI框架是什麼?我很確定這種做事方式是錯誤的,尤其是在C#5.0世界中 – Stilgar

+0

我沒有看到你訪問WinForms的地方。也不要手動創建線程。使用例如ThreadPool.QueueUserWorkItem – stepandohnal

回答

1

而不是創建線程來連接,你可以最初假設,你的連接將不會成功。這將需要輪詢定時器重新連接。獎勵:您可以控制計時器(雖然您無法對匿名線程執行任何操作),但您可以將其用於其他需要輪詢的任務(重新發送數據,該數據一開始就沒有交付,如果更改套接字設置,則在斷開連接後排隊連接等) 。

這個輪詢定時器可以是一個普通的UI定時器(如果是winforms,則爲Timer),那麼你不需要任何調用。如果你這樣做,那麼確保它沒有阻塞操作(例如,發送數據並等待答案)。

否則,您可以使用this擴展方法的方法總是在UI線程中運行它們

public static void InvokeIfRequired(this Control control, MethodInvoker action) 
{ 
    if (control.InvokeRequired) 
     control.Invoke(action); 
    else 
     action(); 
} 

在你的情況,你會想打電話給Write這樣

someUIControl.InvokeIfRequired(() => Write(...)); 

或者乾脆讓Write像這樣的方法

void Write(...) 
{ 
    if(someUIControl.InvokeRequired) 
     someUIControl.Invoke((delegate)() => Write(...)); 
    else 
    { 
     ... job here 
    } 
} 
+0

在Invoke答案之上,我讚賞對輪詢計時器的建議。我明白這可能會更有用。 –

1

在提出的方案中這樣做,它是使用new ThreadThread.SleepInvoke簡單的一種方式計劃在15秒內在UI線程上發生一些工作。它會工作,但...效率很低(線程昂貴)。坦率地說,應該使用一個計時器 - 或者在4.5上使用Task.Delay(實際上它只是包裝了一個計時器)。