Question

J'utilise SocketAsyncEventArgs pour communiquer avec des centaines d'équipements (la plupart d'entre eux par GPRS). Parfois, certains d'entre eux cessent de répondre et il semble que je n'ai aucun moyen de temps l'opération, comme l'indique la documentation que les options de délai d'attente (ie SocketOptionName.SendTimeout ) ne fonctionne pas sur la communication asynchrone.

Je suis à la recherche d'un moyen de contrôle pour les délais d'attente lors d'Envoi / réception / ConnectAsync. Il ne doit pas bloquer le fil (donc, appeler someMonitor.WaitOne (SomeTimeoutValue) ne fera pas) et je ne veux pas créer une instance de minuterie par opération (comme le nombre d'équipements augmentera sûrement).

Des conseils sur ce sujet?

Était-ce utile?

La solution

Voici comment je l'ai fait (barbante que je ne l'ai pas comme la solution):

l'idée est d'avoir une minuterie qui, lors de la cuisson, vérifie toutes les opérations en attente pour les délais d'attente. J'ai créé une interface que mes clients: async outils

public interface ITimeoutable {
    event Action<ITimeoutable, Operation> Begin;
    event Action<ITimeoutable, Operation> End;
    void DoTimeout(Operation operation);
}

où l'opération est un enum, défini comme suit:

public enum Operation {
    Connect,
    Send,
    Receive,
    Disconnect
}

, le client déclenche un événement de Begin lors du démarrage d'une opération asynchrone et déclenche l'événement End quand il se termine. De l'autre côté, j'ai créé un TimeoutManager, qui a une collection de clients async et un dictionnaire avec les opérations et l'instant où ils ont commencé. Lors de la création d'un nouveau client, il est inscrit dans le TimeoutManager, qui souscrit aux événements. Le TimeoutManager utilise un System.Threading.Timer pour vérifier quelles opérations chronométrées sur. Si elle a un délai d'attente, il appelle la méthode DoTimeout (depuis l'interface ITimeoutable).

Il est un code assez complexe, et je ne l'aime pas. Mais cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top