2013-02-20 26 views
9

TcpClient bağlantılarını kabul eden bir yöntem oluşturmaya çalışıyorum ve bir istemci "ConnectedAction" bağlandığında bir görev gerçekleştiriyorum. "ConnectedAction" temsilcisini çalıştırmak için oluşturulmuş yeni bir görev yapmaya çalışırken bir derleme hatası alıyorum.Task.Run nasıl kullanılır (İşlem <T>)

Tartışma 1: dönüştürmek olamaz 'boşluk' 'System.Func' için

ben yöntemi "ConnectedAction" yöntemini çalıştırmak ve boşluğu döndürmeye çalışıyor çünkü bu hata olduğuna inanıyoruz

Görev.Run parametresi.

Task, "ConnectedAction" temsilcisini nasıl çalıştırıyor?

class Listener 
{ 
    public IPEndPoint ListenerEndPoint {get; private set;} 
    public int TotalAttemptedConnections { get; private set; } 
    public Action<TcpClient> ConnectedAction { get; private set; } 

    public Listener(IPEndPoint listenerEndPoint, Action<TcpClient> connectedAction) 
    { 
     ConnectedAction = connectedAction; 
     ListenerEndPoint = listenerEndPoint; 

     Task.Factory.StartNew(Listen, TaskCreationOptions.LongRunning); 
    } 

    private void Listen() 
    { 
     TcpListener tcpListener = new TcpListener(ListenerEndPoint); 
     tcpListener.Start(); 

     while (true) 
     { 
      TcpClient tcpClient = tcpListener.AcceptTcpClient(); 
      TotalAttemptedConnections++; 

      //Error here 
      Task.Run(ConnectedAction(tcpClient)); 
     } 
    } 
} 

cevap

14

Sen yazmalısınız:

Task.Run(() => ConnectedAction(tcpClient)); 

Bu, hiçbir parametre alır ve doğru argüman ile belirtilen işlevi arayacak bir lambda işlevi oluşturur. Lambda, Task.Run parametrelerinin gereksinim duyduğu delegeye yazılmıştır.

Ne yazdınız, işlevi çağırır ve ardından işlevin dönüş değerini bir temsilci haline getirmeye çalışır.

+0

Tam olarak aradığım şey. Teşekkürler! –

İlgili konular