我有我用C#編寫的代理服務器。我也有一個Java applet,通過這個C#代理接收來自視頻服務器的MJPEG數據。我的問題是,當視頻服務器當前沒有更多的MJPEG數據可用時,代理卡住在阻塞讀取調用中,我無法終止它。多線程生產者/消費者
// write the forwarded output
// blocking on remoteServerResponseStream.Read
while (m_running && (read = remoteServerResponseStream.Read(buffer, 0, buffer.Length)) > 0)
{
bytesRead += read;
output.Write(buffer, 0, read);
output.Flush();
}
這應該由Java小程序關閉流(可變output
在上面的代碼)被終止。但是,Java小應用程序無法關閉此連接,因爲代理從未確認關閉請求,而它仍處於等待數據的remoteServerResponseStream.Read
中。
我一直在這個問題上停留了一個星期。我想我可能會想到一個解決方案,但我不確定它是否會起作用。我很想聽到關於此的任何反饋。
我的想法是在另一個線程上使用removeServerResponseStream.Read
並使用共享隊列來傳輸數據。線程將讀取數據並將其放置在隊列中。然後,我的主線程會將隊列中可用的任何數據轉發到output
。這樣,我可以不斷檢查output.CanWrite
是否成爲假,在這種情況下,我可以中止讀線程(這是我知道中斷阻塞流讀取的唯一方法)。這是一個可行的解決方案嗎?如果是這樣,我應該不斷地輪詢隊列以獲取可用的數據,還是應該創建一個事件?我很想聽到關於這個問題的任何想法!提前致謝。
您應該使用.NET 4.0 Task Parallel Library中引入的併發集合和其他容器類。 – dthorpe
我們需要額外的代碼。 –