2017-12-02 21 views
0

我正在編寫一個基於here示例的簡單TCP服務器。 而不是回顯收到的數據我想保持打開套接字發送和接收更多的數據。執行動作<T>出隊後

因此,我改變了一些功能如下:

public readonly ConcurrentQueue<Action<String>> actions = new ConcurrentQueue<Action<String>>(); 

public void AcceptCallback(IAsyncResult ar) 
{ 
    allDone.Set(); 

    Connected.Invoke(this, new EventArgs()); 
    Socket listener = (Socket)ar.AsyncState; 
    Socket handler = listener.EndAccept(ar); 

    StateObject state = new StateObject 
    { 
     workSocket = handler 
    }; 
    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); 

    while (handler.Connected) 
    { 
     if (actions.TryDequeue(out Action<String> action)) 
     { 
      try 
      { 
       action(/* ??? */); 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 
     Thread.Sleep(0); 
    } 
} 

public void SendData(String data) 
{ 
    Socket handler = state.workSocket; 
    byte[] byteData = Encoding.ASCII.GetBytes(data); 
    handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); 
} 

的外螺紋我排隊我的數據:

String data = "something"; 
server.actions.Enqueue((x) => server.SendData(data)); 

我不明白如何檢索「數據」值,在將Action解除之後。 「行動」實際上是一個動作,但是當我嘗試調用它:

action(); 

編譯器說:

錯誤CS7036沒有給出說法,對應於所需形式參數「OBJ」 '行動'。

很明顯,我沒有通過論證,但我不明白我應該在哪裏以及如何找回它。

+0

也許你想排隊的字符串,只是調用相同的行動或方法? – kenny

+0

擺脫(x) – kenny

+0

x可能有效,但對我來說似乎是一種解決方法。我在lambda表達式中傳遞了「data」參數。它去了哪裏? – Mark

回答

3

你的問題是在這裏:

server.actions.Enqueue((x) => server.SendData(data)); 

您已經在封閉拍攝data,爲什麼需要論證x的?只是存儲的動作將調用server.SendData(data)

server.actions.Enqueue(() => server.SendData(data)); 

當然,你需要相應地改變actions類型:

public readonly ConcurrentQueue<Action> actions = 
    new ConcurrentQueue<Action>(); 

現在像你這樣想,你可以調用動作:action()