从后台线程

时间:2016-08-03 14:21:16

标签: multithreading wcf

我正在处理一段代码,该代码将向WebAPI控制器发出API请求,并通过该代码调用WCF Web服务。这将阻止,直到WCF服务响应并导致诸如超时和性能问题之类的问题。由于我无法控制的多种原因,我无法对此特定用例使用async / await。

我正在考虑在单独的线程上关闭此WCF调用,因此在WebAPI控制器中我执行以下操作:

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

然而,代码正在爆炸。调用WCF服务的行未更改为上面的代码块,但现在我得到了:

  

无法访问已处置的对象。对象名称:   ' System.ServiceModel.Channels.ServiceChannel'

在抛出异常时查看堆栈跟踪,我可以看到服务器堆栈跟踪如下:

  

服务器堆栈跟踪:at   System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable()   在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan   超时)at   System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel   频道,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度   超时,CallOnceManager级联)at   System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage   methodCall,ProxyOperationRuntime operation)at   System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天   消息)

我对WCF没有多少经验,所以想知道是否有一些关于在后台线程中调用此服务的怪癖,或者是否还有其他我需要做的事情呢?

我尝试使用Google搜索,但所有结果都与从 WCF服务中调用后台线程有关,而不是从后台调用WCF服务。 / p>

有什么想法吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

所以我最终想到了这一点。这是一个团结问题。出于某种原因,现有代码是:

container.RegisterType<IMyServiceWrapper, MyServiceImplementation>()

我必须明确告诉Unity如何解析构造函数参数:

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

不幸的是,我不知道为什么要这么做或为什么修复它?