C# 如何在WCF服务操作中等待任务完成

C# 如何在WCF服务操作中等待任务完成,c#,wcf,asynchronous,C#,Wcf,Asynchronous,如果以前有人问过这个问题,我很抱歉,但我正在努力找到一个适合我目前情况的答案 我正在从事一个项目,其中要求我通过WCF服务公开基于任务的提供者的操作。provider接口将Task明确定义为每个方法的返回类型,下面是一个示例: public interface IContactProvider { Task<IEnumerable<Contact>> GetAllContacts(); } 公共接口IContactProvider { 任务GetAllCont

如果以前有人问过这个问题,我很抱歉,但我正在努力找到一个适合我目前情况的答案

我正在从事一个项目,其中要求我通过WCF服务公开基于任务的提供者的操作。provider接口将
Task
明确定义为每个方法的返回类型,下面是一个示例:

public interface IContactProvider
{
    Task<IEnumerable<Contact>> GetAllContacts(); 
}
公共接口IContactProvider
{
任务GetAllContacts();
}
为了将其公开为WCF服务,我基本上定义了提供者接口的“同步”版本以用作服务契约,从而产生如下所示的服务实现:

public class ContactService : IContactService
{
    private IContactProvider contactProvider;

    public IEnumerable<Contact> GetAllContacts()
    {
        return contactProvider.GetAllContacts().Result;
    }
}
公共类ContactService:IContactService
{
私人IContactProvider contactProvider;
public IEnumerable GetAllContacts()
{
返回contactProvider.GetAllContacts().Result;
}
}

我的直觉告诉我,我在这里做错了什么,我应该“等待”以其他方式获得
结果。有更好的方法吗?

您正在做的工作应该可以正常工作(
结果将被阻止,直到任务完成),但是您使用的是.NET 4.5吗?如果是这样,您可以简单地声明服务操作契约,直接返回
异步任务。这样,您的客户机将自动获得同步或异步调用它的选项(通过生成的服务客户机)


我发现有一篇帖子比MSDN文档更有用:

我想
Result
阻塞这一事实正是我所担心的。我不想创建一个服务死锁的场景,但这在这里可能是不可能的?此外,我正在使用.NET4.5,但我不能保证其他客户机将使用.NET(或.NET4.5);在服务合约中使用Task是否会给这些客户端带来问题?@sellmeadog您不应该对客户端和服务器端合约重复使用相同的接口。服务器端接口可以是
Task GetAllContactsAsync()和客户端接口可以是
IEnumerable GetAllContacts()
,它将“只工作”于WCF。WCF会自动向客户端公开每个方法的同步和异步版本,但服务器只需要实现其中一个。