我在WPF应用程序中使用ServiceHost。当我调用ServiceHost.Open方法时,它需要大约30秒才能完成(我连接到Azure ServiceBus。漫长的等待时间似乎来自我们公司的互联网代理)。
因为需要很长时间,我希望此调用不会阻止Dispatcher线程,它应该支持Cancellation。不幸的是,ServiceHost不支持Task API,但很容易创建一个:
public static class CommunicationObjectExtensions
{
public static Task OpenAsync(this CommunicationObject co, CancellationToken token)
{
token.Register(() => co.Abort());
return Task.Factory.FromAsync(co.BeginOpen(null, null), co.EndOpen);
}
}
为什么ServiceHost.BeginOpen调用会阻塞Dispatcher线程? MSDN文档说,BeginOpen将以异步方式完成。这样就不应该阻止Dispatcher线程了。