public BlipStatus GetUpdate(string id)
{
string query = string.Format("updates/{0}?include=user", id);
//pobieramy odpowiedź
BlipCommunicationState state = BlipCommunicationState.OK;
Exception exp = null;
HttpStatusCode httpCode = HttpStatusCode.OK;
HttpResponseMessage resp = null;
BlipStatus status = null;
EventWaitHandle waitHandle = new AutoResetEvent(false);
try
{
ThreadPool.QueueUserWorkItem(
c =>
{
try
{
lock (httpSyncClientLock)
{
//to może długo trwać, a przebywanie w lock
//za duługo może spowodować zakleszczenie
resp = blipHttpClientSync.Get(query);
}
//to może długo trwać, a przebywanie w lock
//za duługo może spowodować zakleszczenie
//resp = blipHttpClient.Get(query);
}
catch (Exception)
{
//gdy wystąpiły jakieś błędy w komunikacji
}
finally
{
waitHandle.Set();
}
}
);
waitHandle.WaitOne(WebGetTimout);
if (resp != null && resp.StatusCode == HttpStatusCode.OK)
{
resp.EnsureStatusIsSuccessful();
status = resp.Content.ReadAsJsonDataContract<BlipStatus>();
}
}
catch (HttpStageProcessingException stageEx)
{
state = BlipCommunicationState.CommunicationError;
httpCode = resp.StatusCode;
}
catch (ArgumentOutOfRangeException aorEx)
{
state = BlipCommunicationState.CommunicationError;
httpCode = resp.StatusCode;
//gdy wystąpiły jakieś błędy w komunikacji
}
catch (SerializationException serEx)
{
state = BlipCommunicationState.CommunicationError | BlipCommunicationState.Error;
httpCode = resp.StatusCode;
exp = serEx;
}
catch (Exception)
{
//jeśli nie uda się pobrać statusu to zwróć null
return null;
}
finally
{
if (resp != null)
{
resp.Dispose();
resp = null;
}
}
if (((state & BlipCommunicationState.CommunicationError) == BlipCommunicationState.CommunicationError)
&& CommunicationError != null)
{
CommunicationError(null, new CommunicationErrorEventArgs(httpCode, BlipActions.AfterGetUpdate));
}
if ((state & BlipCommunicationState.Error) == BlipCommunicationState.Error && ExceptionOccure != null)
{
ExceptionOccure(null, new ExceptionEventArgs(exp));
}
return status;
}