Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步编程模型(APM)是否在WCF操作期间阻止线程?_C#_Multithreading_Wcf_Asynchronous - Fatal编程技术网

C# 异步编程模型(APM)是否在WCF操作期间阻止线程?

C# 异步编程模型(APM)是否在WCF操作期间阻止线程?,c#,multithreading,wcf,asynchronous,C#,Multithreading,Wcf,Asynchronous,我正在开发一个高度线程化的应用程序,我们的服务器调用使用的是使用APM模式的WCF 我们不打算使用.NET4.5.1,所以我不能在TPL中使用async/await。我最终试图弄清楚,仍然使用TPL(带有Task.Factory.fromsync())是否比APM更有益 APM模式在等待WCF操作从网络返回时是否会阻止线程 编辑:代码示例 public void DoSomething() { IWcfServiceAgentAsync agent = new WcfServiceAgent

我正在开发一个高度线程化的应用程序,我们的服务器调用使用的是使用APM模式的WCF

我们不打算使用.NET4.5.1,所以我不能在TPL中使用
async/await
。我最终试图弄清楚,仍然使用TPL(带有
Task.Factory.fromsync()
)是否比APM更有益

APM模式在等待WCF操作从网络返回时是否会阻止线程

编辑:代码示例

public void DoSomething()
{
  IWcfServiceAgentAsync agent = new WcfServiceAgentProxy();

  var request = new DoSomethingRequest();

  agent.BeginDoSomething(request,
    iar =>
    { 
      var response = agent.EndDoSomething(iar);

      /*
       * Marshal back on to UI thread with results
       */
    }, null);
}

对于您提供的代码示例,它不会阻止任何线程。如果你这样做了,可能会被阻止

public void DoSomething()
{
  IWcfServiceAgent agent = new WcfServiceAgentProxy();

  var request = new DoSomethingRequest();

  var iar = agent.BeginDoSomething(request, null, null);

  //Do some other time consuming work that does not depend on the response.    

  var response = agent.EndDoSomething(iar); //This blocks till DoSomething completes.

  //Do something with the response.

}

调用
endyourwcfffunction(asyncResult)
会阻止线程。因此,这取决于调用函数的方式。我们不需要WCF代理本身的代码,只需要一个您计划如何使用该代理的示例。编辑:我已经删除了我以前的不相关评论,请也删除你的。@ScottChamberlain我已经用代码示例修改了我的问题,我们使用自定义代理生成器,所以我不确定代码示例有多大帮助。@Cameron:请注意,
Microsoft.Bcl.Async
NuGet软件包在.NET 4.0上为UI应用程序启用了
Async
。@StephenCleary Scott和我之前讨论过类似的内容,但我们删除了注释。我使用的是VS 2010,它需要VS 2012。我理解这一点。我需要进一步澄清我的问题,然而,我认为这将保证一个不同的问题。@Cameron我想你是在问,在
开始时,是否有一个线程在后台被占用,调用了某个
,调用了你的回调委托?答案是“不是真的,但是是的”,它经常这样做。一旦WCF完成,它会向完成端口发送信号,然后完成端口会安排回调在线程池线程上发生。阅读博客文章“这是关于TPM的,但同样的逻辑适用于APM…”。。。有一点需要注意,我不能100%确定“一旦WCF完成,它会向完成端口发送信号,然后完成端口会安排回调在线程池线程上发生。”。回调可能在IOCP特定的线程池线程上执行,该线程不是正常线程池最大线程数的一部分,但我不知道是否会发生这种情况。然而,我确实知道,从
BeginXxxxx
调用完成到回调开始执行之前,没有线程处于阻塞状态等待着执行。这就是我想问的,但我想我就是找不到合适的词来表达我的观点。我问了另一个问题。谢谢你的回复。