等待通知异步调用

时间:2016-03-08 05:10:08

标签: c# async-await

我正在尝试获取给定用户的lync状态。我的代码将使用64位环境中的UCMA 4.0与lync server 2010交谈。

这是我的代码,等待异步调用以获取lync状态。

switch

我不确定如何等到private async void getNotifications(UserEndpoint endpoint, string useridSIP) { _userEndpoint.PresenceServices.BeginPresenceQuery( new[] { useridSIP }, new[] { "state" }, null, (ar) => { Task<List<RemotePresentityNotification>> notificationFetch = _userEndpoint.PresenceServices.EndPresenceQuery(ar).ToList<RemotePresentityNotification>(); List<RemotePresentityNotification> result = await notificationFetch; result.ForEach(x => { LyncUser user = new LyncUser(); if (x.AggregatedPresenceState != null) { user.Presence = x.AggregatedPresenceState.Availability.ToString(); } else { user.Presence = "Unknown"; } user.UserName = x.PresentityUri.ToString(); usersWithStatus.Add(user); }); }, null); } 结果返回

List<RemotePresentityNotification>

整个源代码。

Task<List<RemotePresentityNotification>> notificationFetch = _userEndpoint.PresenceServices.EndPresenceQuery(ar).ToList<RemotePresentityNotification>();
List<RemotePresentityNotification> result = await notificationFetch;

1 个答案:

答案 0 :(得分:1)

我相信您正在寻找Task.Factory.FromAsync方法。此方法是BeginEnd async模式 - detailed here的包装。例如,你想要这样做:

private async Task<List<RemotePresentityNotification>> GetNotifications(UserEndpoint endpoint, string useridSIP)
{
    var task = Task.Factory.FromAsync(
        _userEndpoint.PresenceServices.BeginPresenceQuery,
        _userEndpoint.PresenceServices.EndPresenceQuery,
        new[] { useridSIP },
        new[] { "state" });

   var results = await task;
   return results.ToList();
}
  1. 避免async void详细here
  2. 仅当存在相应的async
  3. 时才使用await

    有了这个,你可以await然后按照你认为合适的方式处理它,就像这样:

    private async Task SomeCaller(UserEndpoint endpoint, string useridSIP)
    {
        var list = await GetNotifications(endpoint, useridSIP);
        // ... do stuff with it
    }
    

    更新1

    通过查看详细here PresenceServices,确保确保State实际上可用。

      

    只要端点的State属性设置为Established,就可以使用所有状态服务。

    此外,this可能有助于您查看。