2015-02-12 10 views
6

Ich habe diese asynchrone Anforderung:Pubnub Synchronisationsanforderung ausführen

Pubnub pn = new Pubnub(publishKey, subscribeKey, secretKey, cipherKey, enableSSL); 

pn.HereNow("testchannel", res => //doesn't return a Task 
{ //response 
}, err => 
{ //error response 
}); 

Das Problem ist, dass ich weiß nicht, wie es synchron laufen. Bitte helfen Sie.

+0

Was ist Pubnub? Ist das deins. – i3arnon

+0

Nein http://pubnub.com – Andrei

+0

synchron oder asynchron? – i3arnon

Antwort

4

Ich bin mit pubnub nicht vertraut, aber was Sie versuchen sollte so einfach wie dies zu erreichen sein:

Pubnub pn = new Pubnub(publishKey, subscribeKey, secretKey, cipherKey, enableSSL); 

var tcs = new TaskCompletionSource<PubnubResult>(); 

pn.HereNow("testchannel", res => //doesn't return a Task 
{ //response 
    tcs.SetResult(res); 
}, err => 
{ //error response 
    tcs.SetException(err); 
}); 

// blocking wait here for the result or an error 
var res = tcs.Task.Result; 
// or: var res = tcs.Task.GetAwaiter().GetResult(); 

Beachten Sie, dass synchron asynchron Sachen tun, ist nicht zu empfehlen. Sie sollten in diesem Fall bei Verwendung von async/await, schauen Sie tun würden:

var result = await tcs.Task; 
+1

Ehrfürchtig. Funktioniert perfekt für mich. – Andrei

+1

Gute Lösung, danke. Die letzte Zeile sollte var res = tcs.Task.Result sein –

1

ich dieses Problem gelöst, die die @Noseratio ideia mit einer einfachen Erweiterung verwenden.

private Task<string> GetOnlineUsersAsync() 
{ 
    var tcs = new TaskCompletionSource<string>(); 

    _pubnub.HereNow<string>(MainChannel, 
     res => tcs.SetResult(res), 
     err => tcs.SetException(new Exception(err.Message))); 

    return tcs.Task; 
} 

// using 
var users = await GetOnlineUsersAsync();