Мне нужно написать простой клиент для чат-сервера, и я хочу одновременно проверять ввод с консоли и из сокета, подключенного к серверу. Вот желаемое поведение в C, и я хочу воспроизвести это поведение в C#:
while (true) {
//make set of descriptors
fd_set reads;
FD_ZERO(&reads);
FD_SET(client_socket, &reads);
FD_SET(0, &reads);
select(client_socket+1, &reads, NULL, NULL, NULL);
//handle user input from stdin
if (FD_ISSET(0, &reads)) {
///
}
//handle message from server
if (FD_ISSET(client_socket, &reads)) {
///
}
}
Я придумал это решение на C#, но не уверен, что оно допустимо и эффективно. Есть ли другие подходы?:
var ongoingTasks = new List {getServerMsg, getUserMsg};
while (true)
{
var finishedTask = await Task.WhenAny(ongoingTasks);
if (finishedTask == getServerMsg) {
OutputServerMsg();
ongoingTasks.Remove(getServerMsg);
getServerMsg = ReceiveMessageFromServer();
ongoingTasks.Add(getServerMsg);
} else if (finishedTask == getUserInput) {
SendMsgToServer();
ongoingTasks.Remove(getUserInput);
getUserInput = ReceiveInputFromStdIn();
ongoingTasks.Add(getUserInput);
}
}
Подробнее здесь: https://stackoverflow.com/questions/782 ... ng-sockets