根据MSDN:
hEvent:如果在没有 I/O 完成例程的情况下发出重叠 I/O 操作(操作的 lpCompletionRoutine 参数设置为 null),则此参数应包含 WSAEVENT 对象的有效句柄或为 null。
当我使用 IOCP 时,当我调用 WSASend() 或 WSARecv() 时,我将 NULL 传递给它们的最后一个参数(即 lpCompletionRoutine):
WSASend(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, pIoRequest->GetFlags(), pIoRequest, NULL);
WSARecv(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, &(pIoRequest->GetFlags()), pIoRequest, NULL);
我的“每个 I/O 数据”类 (pIoRequest) 看起来像:
class IoRequest : public WSAOVERLAPPED
{
public:
    IoRequest()
    {
        ...
        SecureZeroMemory(this, sizeof(WSAOVERLAPPED));
        hEvent = WSACreateEvent(); // A
    }
    ...
    void ResetForNextIoRequest()
    {
        WSACloseEvent(hEvent); // B
        SecureZeroMemory(this, sizeof(WSAOVERLAPPED));
        hEvent = WSACreateEvent(); // C
        ...
    }
    ...
    DWORD& GetFlags() { return m_dwFlags; }
    ...
private:
    ...
    DWORD m_dwFlags;
    ...
};
即使我注释掉上面标记为 A、B 和 C 的行,它似乎对我的程序的行为也没有任何影响。
那么您如何决定何时调用 WSACreateEvent() 或简单地将 hEvent 设置为 NULL?