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年
的異常被拋出當您嘗試一次從多個線程訪問的管道。管道不是線程安全的,你確定你不能同時訪問它們的兩個線程嗎? – hcb
創建多個調用DoAction的線程時,代碼在第一次調用時崩潰,因爲第二個NamedPipeServerStream(PIPE_TO)實例已創建。我嘗試添加鎖(SyncToObject),但代碼仍輸入兩次。我認爲,因爲它運行在一個單獨的AppDomain中,但我不知道如何在單獨的AppDomains中使用對象 – Laurijssen
您可以將調用轉移到AppDomainCallback()進入任務嗎?或者是該方法自動在另一個線程上調用,因爲它在另一個域中? – hcb