2013-08-26 86 views
7

以下代碼創建一個新的線程,首先作爲命名管道客戶機發送參數,然後作爲服務器檢索結果。之後,它在另一個作爲命名管道服務器的AppDomain中執行一個函數,然後作爲客戶端發送結果。C#所有管道實例都正忙

public OrderPrice DoAction() 
{ 
    Task<OrderPrice> t = Task<OrderPrice>.Factory.StartNew(NamedPipeClient, parameters); 

    if (domain == null) 
    { 
    domain = AppDomain.CreateDomain(DOMAINNAME); 
    } 
    domain.DoCallBack(AppDomainCallback); 

    return t.Result; 
} 

static OrderPrice NamedPipeClient(object parameters) { 
    OrderPrice price = null; 

    using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_TO)) { 
    stream.Connect(); 
    SerializeToStream(stream, parameters); 
    } 

    using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_BACK)) { 
    stream.WaitForConnection(); 

    price = (OrderPrice)DeserializeFromStream(stream); 
    } 

    return price; 
} 

void AppDomainCallback() { 
    OrderPrice price = null; 

    using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_TO)) { 
    stream.WaitForConnection(); 

    List<object> parameters = (List<object>)DeserializeFromStream(stream); 

    if (mi != null) 
     price = (OrderPrice)mi.Invoke(action, parameters.ToArray()); 
} 

    using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_BACK)) { 
    stream.Connect(); 
    SerializeToStream(stream, price); 
    } 
} 

該代碼平均每秒調用一次,它可以正常工作7個小時以上。但在某些時候,「system.io.ioexception所有管道實例都很忙」,並且在此之後他們不再重新連接。在這裏瀏覽它似乎可能是因爲沒有正確處理管道對象,但我猜這是所有好的,因爲它們在裏面使用語句。 有沒有人有任何線索可能是錯誤的?該代碼是在.NET 4.0 Windows服務器上運行的2008年

+3

的異常被拋出當您嘗試一次從多個線程訪問的管道。管道不是線程安全的,你確定你不能同時訪問它們的兩個線程嗎? – hcb

+0

創建多個調用DoAction的線程時,代碼在第一次調用時崩潰,因爲第二個NamedPipeServerStream(PIPE_TO)實例已創建。我嘗試添加鎖(SyncToObject),但代碼仍輸入兩次。我認爲,因爲它運行在一個單獨的AppDomain中,但我不知道如何在單獨的AppDomains中使用對象 – Laurijssen

+0

您可以將調用轉移到AppDomainCallback()進入任務嗎?或者是該方法自動在另一個線程上調用,因爲它在另一個域中? – hcb

回答