执行动作<T>出队后
我正在编写一个基于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” '行动'。
很明显,我没有通过论证,但我不明白我应该在哪里以及如何找回它。
回答:
你的问题是在这里:
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()
。
以上是 执行动作<T>出队后 的全部内容, 来源链接: utcz.com/qa/258164.html