2016-08-03 151 views
0

我正在處理一段代碼,該代碼將一個API請求接收到WebAPI控制器,並通過該請求調用WCF Web服務。這會阻止,直到WCF服務響應並導致問題,如超時和性能問題。出於許多我無法控制的原因,我無法使用異步/等待處理此特定用例。從後臺線程調用WCF服務

我期待在一個單獨的線程踢這個WCF取消呼叫,所以在控制器的WebAPI我做這樣的事情:

New Thread(()=>{ 
    //Call WCF service here 
    //Do something with the response 
}).Start(); 

但是,代碼是吹起來。調用WCF服務的線路未被更改爲上述代碼塊,但現在我得到:

無法訪問處置的對象。對象名稱: 'System.ServiceModel.Channels.ServiceChannel'。

望着當拋出異常的堆棧跟蹤,我可以看到服務器堆棧跟蹤如下:

服務器堆棧跟蹤:在 System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable() 在System.ServiceModel.Channels.CommunicationObject.Open(時間跨度 超時)在 System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel 信道,時間跨度超時)在 SYST em.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(時間跨度 超時,CallOnceManager級聯)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串動作, 布爾單向,ProxyOperationRuntime操作,對象[]插件, 對象[]奏,時間跨度超時)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 包括methodCall,ProxyOperationRuntime操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即時聊天 消息)

Im不經歷巨大與WCF如此想知道是否有關於卡爾的一些怪癖在後臺線程中使用該服務,或者如果還有其他事情需要我去做?

我試着用搜索引擎這一點,但所有的結果都屬於調用從後臺線程內 WCF服務,而不是從後臺調用WCF服務

任何想法?

回答

0

所以我最後想到了這一點。這是一個統一問題。出於某種原因,而現有的代碼是:

container.RegisterType<IMyServiceWrapper, MyServiceImplementation>() 

我必須明確地告訴團結如何解決構造函數參數:

container.RegisterType<IMyServiceWrapper, MyServiceImplementation>(
    new InjectionConstructor(container.Resolve<IMyDependentService>())); 

不幸的是,我不知道爲什麼這是必需的或爲什麼修復?

0

我非常確定,你在線程之外創建WCF服務的實例。所以,以前它看起來像:

using(var client = new WcfServiceClient()) 
{ 
    client.CallSomeMethod(); 
} 

而你把它改爲類似:

using(var client = new WcfServiceClient()) 
{ 
    new Thread(() => { 
     client.CallSomeMethod(); 
    }).Start(); 
} 

而你所需要的就是客戶創造進入主題:

new Thread(() => { 
     using(var client = new WcfServiceClient()) 
     { 
      client.CallSomeMethod(); 
     } 
    }).Start(); 
}