2013-08-02 49 views
0

我使用.Net的Socket.BeginReceive方法,而我從EndReceive方法中獲取數據時,我使用AutoResetEvent.waitone塊EndReceive代碼線程無限地發現BeginReceive無法工作;所有線程都被阻塞;直到計時器結束,我什麼都沒有得到,併發出信號,我可以再次獲取數據。 BeginReceive不是一個異步方法?.net Sock.BeginReceive接收和阻止EndReceive

var sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, i => { 
    var sock= (Socket)i.AsyncState; 
    int readNum=sock.EndReceive(i); 
    var reset= new AutoResetEvent(false); 
    Timer timer = new Timer({ Thread.Sleep(1000000000); reset.set() }); 

    reset.WaitOne(Timeout.Infinite); 
    time.Dispose(); 
} ,sock); 

僅僅配置計時器我必須創建新的線程等待!

+0

你可以張貼相關的代碼嗎? BeginReceive是一個異步方法,它只會阻塞它創建的線程,而不是你的主應用程序線程。我會猜測你使用'AutoResetEvent'會導致這個問題。 – Sean

+0

添加代碼到你的問題,有一個編輯鏈接正下方的標籤=] – Sean

+0

我只是讓回調方法等待AutoResetEvent之後,我什麼都收不到,但當我設置AutoResetEvent我可以正常接收數據 – user2645410

回答

0

AutoResetEvent,e被包含在一個臨時閉包中,因此創建用於處理EndReceive代碼的線程將無限期地等待。

你會好起來的重構你的代碼是這樣的:

bool stopped = false; 
var timer = null; 

void MainFunction() 
{ 
    var buffer = new byte[1024]; 
    var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallback), sock); 
} 

void ReadCallback(IAsyncResult ar) 
{ 
    var sock = (Socket)ar.AsyncState; 

    int readNum = sock.EndReceive(ar); 

    // begin receiving again as long as we shouldn't be stopped 
    if (stopped == false) 
    { 
     sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallback), sock); 
    } 

    if (timer == null) 
    { 
     Timer timer = new Timer({ Thread.Sleep(1000000000); stopped = true; }); 
    } 
} 

您需要將您的SetAutoResetEvent信號,即資源是免費的。我看不到你提供的任何代碼。

你可能想看看一些例子和文檔在http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

+0

我無法理解的是,我可以從其他theads接收數據,儘管EndReceive代碼將在一個線程中等待,但現在,當一個線程等待時我什麼也沒收到 – user2645410

+0

啊是的,這是因爲您使用共享的'AutoResetEvent'和等待它100萬秒。有沒有任何理由讓你有一百萬秒的等待時間才允許線程再次接收? – Sean

+0

是的,我必須模擬一個設備,它必須在tiemspan做一段時間後,它必須停止;同時我也希望設備保持接收數據埠我發現接收線程不能工作,直到時間跨度結束 – user2645410