如何使用Visual Studio生成的异步WCF调用?

pmi*_*hna 10 .net c# wcf asynchronous

我的OperationContract:

public List<MessageDTO> GetMessages()
        {
            List<MessageDTO> messages = new List<MessageDTO>();
            foreach (Message m in _context.Messages.ToList())
            {
                messages.Add(new MessageDTO()
                {
                    MessageID = m.MessageID,
                    Content = m.Content,
                    Date = m.Date,
                    HasAttachments = m.HasAttachments,
                    MailingListID = (int)m.MailingListID,
                    SenderID = (int)m.SenderID,
                    Subject = m.Subject
                });
            }
            return messages;
        }
Run Code Online (Sandbox Code Playgroud)

在服务引用配置中,我选中了"生成异步操作"选项.我如何使用生成的GetMessagesAsync()?在网上我找到了使用的例子AsyncCallback,但是我不熟悉它.有没有办法以一些友好的方式使用它asyncawait.NET 4.5中的关键字?如果没有,我该怎么做才能异步调用该方法?

Wou*_*ort 7

如果选择"Generate asynchrounous operations",您将获得必须使用回调的"旧"行为.

如果要使用新的async/await语法,则必须选择"生成基于任务的操作"(默认情况下已选中).

使用默认Wcf模板时,这将生成以下代理代码:

  public System.Threading.Tasks.Task<string> GetDataAsync(int value) {
      return base.Channel.GetDataAsync(value);
  }
Run Code Online (Sandbox Code Playgroud)

如你所见,没有更多的回调.而是Task<T>返回a.

您可以通过以下方式使用此代理:

public static async Task Foo()
{
    using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client())
    {
        Task<string> t = client.GetDataAsync(1);
        string result = await t;
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该使用调用方法标记调用方法,async然后await在调用服务方法时使用.