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」 '行動'。
很明顯,我沒有通過論證,但我不明白我應該在哪裏以及如何找回它。
也許你想排隊的字符串,只是調用相同的行動或方法? –
kenny
擺脫(x) – kenny
x可能有效,但對我來說似乎是一種解決方法。我在lambda表達式中傳遞了「data」參數。它去了哪裏? – Mark