我们在Windows服务中包含了一个WCF记录器,它公开了我可以从一个简单的控制台测试应用程序同步和异步调用的各种方法。在调试模式下从工作室运行服务我可以看到各种断点被命中,我们得到了预期的输出。
当我从另一个WCF服务同步调用同步时,方法一切正常......
using (var logger = new LoggerServiceClient())
logger.Log(...);
但是,如果我改为调用Async方法,它什么都不做......
using (var logger = new LoggerServiceClient())
logger.LogAsync(...);
我没有提出错误,代码很高兴继续,但没有任何东西击中记录器服务。它不能是权限,因为同步方法调用工作。
就像我说的,相同的代码和配置在测试控制台应用程序中,并且完美无缺。我可以简单地在调用服务中添加或删除“Async”后缀,但行为不同。我们正在使用w7,框架4.0,使用tpl和4.5目前不是一个选项。
这让我感到难过,所以任何想法,无论多么奇怪,都会被考虑。
答案 0 :(得分:0)
logger.LogAsync()方法将立即返回。 当您使用带有using语句的logger时,也会立即处理logger对象。这可能是因为没有任何东西击中记录器服务。
尝试删除using statement:
var logger = new LoggerServiceClient();
logger.LogAsync(...);
<强>已更新强>
我刚找到一篇文章Do not use “using” in WCF Client。有关于同步模式关闭WCF客户端的示例。
对于异步客户端调用,您可以在任务的延续中关闭WCF客户端:
logger.LogAsync(...).ContinueWith(x => {
// check task
if (x.IsFaulted)
{
// you need to touch x.Exception property here
// or your application will crash because of unhandled exception
Console.WriteLine("LogAsync error occured: {0}", x.Exception);
}
try
{
logger.Close();
}
catch (CommunicationException e)
{
logger.Abort();
}
catch (TimeoutException e)
{
logger.Abort();
}
catch (Exception e)
{
// you will want to log this exception to log file
Console.WriteLine("LogAsync client close error: {0}", e);
logger.Abort();
// no throw here or your application will crash
}
});
延续lambda体很长,你可能想重用它。因此,值得为continuation编写扩展方法。
希望这有帮助。