2014-09-04 95 views
1

如果之前曾询问过此问题的变体,我表示歉意,但我正在努力寻找适用于我目前情况的答案。如何等待任务在WCF服务操作中完成

我正在一个项目中,我被要求通过WCF服务公开基于任务的提供者的操作。提供者接口明确定义Task<T>每个方法的返回类型,这里有一个例子:

public interface IContactProvider 
{ 
    Task<IEnumerable<Contact>> GetAllContacts(); 
} 

在试图揭露这是一个WCF服务,我已经基本确定供应商界面的“同步”版本作为导致看起来像这样的服务实现的服务合同的使用:

public class ContactService : IContactService 
{ 
    private IContactProvider contactProvider; 

    public IEnumerable<Contact> GetAllContacts() 
    { 
     return contactProvider.GetAllContacts().Result; 
    } 
} 

我的直觉告诉我,我在这里做得不对,我应该是“等待”为Result可用一些另一种方式。有一个更好的方法吗?

回答

2

你在做什么应该可以正常工作(Result会阻塞,直到任务完成),但是你使用.NET 4.5吗?如果是这样,您可以简单地声明您的服务运营合同,直接返回async Task<T>。这样你的客户端就可以自动获得同步或异步调用的选项(通过生成的服务客户端)。

这里有一个帖子,我发现比MSDN文档更加有用:http://blog.vuscode.com/malovicn/archive/2012/01/21/what-is-new-in-wcf-in-net-4-5-taskt-and-async.aspx

+0

我猜的事实,'Result'块是什么,我很担心。我不想创建一个场景,其中的服务会出现死锁,但也许这在这里是不可能的?此外,我使用.NET 4.5,但我不能保证其他客户端将是.NET(或.NET 4.5)。在服务合同中使用任务会导致这些客户端出现问题? – sellmeadog 2014-09-04 03:17:52

+2

@sellmeadog您不应该为客户端和服务器端合同重复使用相同的接口。服务器端接口可以是'Task > GetAllContactsAsync();'和客户端接口可以是'IEnumerable GetAllContacts()',它将会与WCF一起工作。 WCF会自动向客户端公开每种方法的同步和异步版本,但服务器只需要实现其中的一种。 – 2014-09-04 03:54:48