2011-10-01 7 views
2

그래서 이런 식으로 뭔가가 :작업을 우아하게 다시 시작하는 방법은 무엇입니까?

Task.Factory.FromAsync<TcpClient>(tcpListener.BeginAcceptTcpClient, tcpListener.EndAcceptTcpClient, tcpListener).ContinueWith(ConnectionAccepted);

private void ConnectionAccepted(Task<TcpClient> tcpClientTask) 
{ 
    TcpClient tcpClient = tcpClientTask.Result; 

    // Do something with tcpClient 
} 

이제 어떻게이 메서드의 끝에 Task.Factory.FromAsync<TcpClient>(...) 다시 시작할 수 있습니까 궁금해? TcpListener에 액세스 할 수 없기 때문에 코드 줄을 복사하여 붙여 넣을 수는 없으며 멤버 변수로 사용하지 않을 것입니다. 비록 내가 해냈다 고해도, 그것은 코드 복제와 같은 긴 코드 행렬입니다.

작업 프레임 워크는이를 수행하는 메커니즘을 제공합니까?

고마워.

답변

2

svick이 제안 했으므로 가장 쉬운 방법은 tcpListener을 필드에 입력하는 것입니다. 그러나 어떤 이유로 든 할 수 없다면 다음 패턴을 시도하십시오.

void AcceptClient() 
{ 
    // Create tcpListener here. 
    AcceptClientImpl(tcpListener); 
} 

void AcceptClientImpl(TcpListener tcpListener) 
{ 
    Task.Factory.FromAsync<TcpClient>(tcpListener.BeginAcceptTcpClient, tcpListener.EndAcceptTcpClient, tcpListener).ContinueWith(antecedent => 
    { 
     ConnectionAccepted(antecedent.Result); 

     // Restart task by calling AcceptClientImpl "recursively". 
     // Note, this is called from the thread pool. So no stack overflows. 
     AcceptClientImpl(tcpListener); 
    }); 
} 

void ConnectionAccepted(TcpClient tcpClient) 
{ 
    // Do stuff here. 
} 
1

Task을 다시 시작하기위한 프레임 워크에 아무 것도 없다고 생각합니다.

그러나 tcpListener을 필드에 넣고 작업을 만드는 줄을 메서드에 넣으면 코드 중복이 발생하지 않으므로 문제를 쉽게 해결할 수 있습니다.

관련 문제