2016-08-03 91 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(); 
}