2009-05-18 3 views
13

Я ищу дополнительную гибкость для класса, который я создал, который устанавливает соединение с удаленным хостом, а затем выполняет обмен информацией (рукопожатие). Текущая реализация предоставляет функцию Connect, которая устанавливает соединение, а затем блокирует ожидание в ManualResetEvent до тех пор, пока обе стороны не завершат квитирование.Какова правильная реализация интерфейса IAsyncResult?

Вот пример того, что называя мой класс выглядит следующим образом:

// create a new client instance 
ClientClass cc = new ClientClass("address of host"); 
bool success = cc.Connect(); // will block here until the 
           // handshake is complete 
if(success) 
{ 

} 

..И вот упрощенно вид на высоком уровне, что делает класс внутренне:

class ClientClass 
{ 
    string _hostAddress; 
    ManualResetEvent _hanshakeCompleted; 
    bool _connectionSuccess; 

    public ClientClass(string hostAddress) 
    { 
     _hostAddress = hostAddress;    
    } 

    public bool Connect() 
    { 
     _hanshakeCompleted = new ManualResetEvent(false);    
     _connectionSuccess = false; 

     // start an asynchronous operation to connect 
     // ... 
     // ... 

     // then wait here for the connection and 
     // then handshake to complete 
     _hanshakeCompleted.WaitOne(); 

     // the _connectionStatus will be TRUE only if the 
     // connection and handshake were successful 
     return _connectionSuccess; 
    } 

    // ... other internal private methods here 
    // which handle the handshaking and which call 
    // HandshakeComplete at the end 

    private void HandshakeComplete() 
    { 
     _connectionSuccess = true; 
     _hanshakeCompleted.Set(); 
    } 
} 

Я ищу в реализацию .NET Classic Async Pattern для этого класса. При этом, я бы обеспечить функции BeginConnect и EndConnect, и позволяют пользователям класса писать код так:

ClientClass cc = new ClientClass("address of host"); 
cc.BeginConnect(new AsyncCallback(ConnectCompleted), cc); 
// continue without blocking to this line 

// .. 

void ConnectCompleted(IAsyncResult ar) 
{ 
    ClientClass cc = ar.AyncState as ClientClass; 
    try{ 
     bool success = cc.EndConnect(ar); 
     if(success) 
     { 
      // do more stuff with the 
      // connected Client Class object 
     } 
    } 
    catch{ 
    } 
} 

Для того, чтобы быть в состоянии предоставить этот API мне нужно создать класс, который реализует Интерфейс IAsyncResult будет возвращен функцией BeginConnect и передан в функцию EndConnect соответственно.

Теперь, мой вопрос: что такое правильный способ реализации интерфейса IAsyncResult в классе?

Одним из очевидных решений было бы создать делегат с соответствующей сигнатурой для функции Connect, а затем асинхронно вызвать этот делегат с помощью BeginInvoke - EndInvoke, но это не то, что я ищу (это не очень эффективно).

У меня есть приблизительное представление о том, как я мог это сделать, но после того, как увидел в рамках .NET Framework, как они реализуют этот шаблон в некоторых местах, я чувствовал, что было бы разумно спросить и посмотреть, успешно ли кто-то это сделал, и если поэтому в каких проблемных областях уделять особое внимание.

Спасибо!

ответ

1

У вас также есть много реализаций в BCL (например, System.Runtime.Remoting.Messaging.AsyncResult) - используйте отражатель или источник отсчета, чтобы проверить их.

Смежные вопросы