我的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;
}
在服务引用配置中,我选中了“生成异步操作”选项。如何使用生成的 GetMessagesAsync()
?在网上我找到了使用 AsyncCallback
的示例,但我对此并不熟悉。有没有办法以某种友好的方式使用它,例如 .NET 4.5 中的 async
和 await
关键字?如果不是,我应该如何异步调用该方法?
最佳答案
如果您选择“生成异步操作”,您将获得必须使用回调的“旧”行为。
如果您想使用新的异步/等待语法,则必须选择“生成基于任务的操作”(默认情况下处于选中状态)。
当使用默认的 Wcf 模板时,这将生成以下代理代码:
public System.Threading.Tasks.Task<string> GetDataAsync(int value) {
return base.Channel.GetDataAsync(value);
}
如您所见,没有更多的回调。取而代之的是 Task<T>
被退回。
您可以通过以下方式使用此代理:
public static async Task Foo()
{
using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client())
{
Task<string> t = client.GetDataAsync(1);
string result = await t;
}
}
你应该用async
标记调用方法然后使用 await
在调用您的服务方法时。
关于c# - 如何使用 Visual Studio - 生成异步 WCF 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13777710/