Mercurial > pub > ImplabNet
comparison Implab/Promise.cs @ 16:5a4b735ba669 promises
sync
author | cin |
---|---|
date | Thu, 07 Nov 2013 20:20:26 +0400 |
parents | 0f982f9b7d4d |
children | e3935fdf59a2 |
comparison
equal
deleted
inserted
replaced
15:0f982f9b7d4d | 16:5a4b735ba669 |
---|---|
101 } | 101 } |
102 | 102 |
103 /// <summary> | 103 /// <summary> |
104 /// Выполняет обещание, сообщая об ошибке | 104 /// Выполняет обещание, сообщая об ошибке |
105 /// </summary> | 105 /// </summary> |
106 /// <remarks> | |
107 /// Поскольку обещание должно работать в многопточной среде, при его выполнении сразу несколько потоков | |
108 /// могу вернуть ошибку, при этом только первая будет использована в качестве результата, остальные | |
109 /// будут проигнорированы. | |
110 /// </remarks> | |
106 /// <param name="error">Исключение возникшее при выполнении операции</param> | 111 /// <param name="error">Исключение возникшее при выполнении операции</param> |
107 /// <exception cref="InvalidOperationException">Данное обещание уже выполнено</exception> | 112 /// <exception cref="InvalidOperationException">Данное обещание уже выполнено</exception> |
108 public void Reject(Exception error) { | 113 public void Reject(Exception error) { |
109 lock (m_lock) { | 114 lock (m_lock) { |
110 if (m_state == PromiseState.Cancelled) | 115 if (m_state == PromiseState.Cancelled || m_state == PromiseState.Rejected) |
111 return; | 116 return; |
112 if (m_state != PromiseState.Unresolved) | 117 if (m_state != PromiseState.Unresolved) |
113 throw new InvalidOperationException("The promise is already resolved"); | 118 throw new InvalidOperationException("The promise is already resolved"); |
114 m_error = error; | 119 m_error = error; |
115 m_state = PromiseState.Rejected; | 120 m_state = PromiseState.Rejected; |