C# 异步编程模型(APM)是否在WCF操作期间阻止线程?
我正在开发一个高度线程化的应用程序,我们的服务器调用使用的是使用APM模式的WCF 我们不打算使用.NET4.5.1,所以我不能在TPL中使用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
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
调用完成到回调开始执行之前,没有线程处于阻塞状态等待着执行。这就是我想问的,但我想我就是找不到合适的词来表达我的观点。我问了另一个问题。谢谢你的回复。