2015-02-12 10 views
6

ho questa richiesta asincrona:Pubnub eseguire richiesta di sincronizzazione

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

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

Il problema è che non so come farlo funzionare in modo sincrono. Per favore aiuto.

+0

Che cos'è Pubnub? È tuo. – i3arnon

+0

No http://pubnub.com – Andrei

+0

in modo sincrono o asincrono? – i3arnon

risposta

4

io non sono a conoscenza pubnub, ma ciò che si sta cercando di raggiungere dovrebbe essere semplice come questo:

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(); 

Nota che facendo cose asincrono sincrono non è consigliabile. Si dovrebbe guardare con async/await, nel qual caso si farebbe:

var result = await tcs.Task; 
+1

Fantastico. Funziona perfettamente per me. – Andrei

+1

Buona soluzione, grazie. L'ultima riga dovrebbe essere var res = tcs.Task.Result –

1

Ho risolto questo problema utilizzando le ideia @Noseratio con una semplice valorizzazione.

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(); 
Problemi correlati