Mercurial > pub > ImplabNet
comparison Implab/AbstractTask.cs @ 187:dd4a3590f9c6 ref20160224
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
Any unhandled OperationCanceledException will cause the promise cancelation
author | cin |
---|---|
date | Tue, 19 Apr 2016 17:35:20 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
186:75103928da09 | 187:dd4a3590f9c6 |
---|---|
1 using System; | |
2 using System.Threading; | |
3 | |
4 namespace Implab { | |
5 /// <summary> | |
6 /// Базовый класс для реализации задачь. Задача представляет собой некторое | |
7 /// действие, которое можно иницировать и обработать результат его выполнения | |
8 /// в виде обещания, для этого оно реализует интерфейс <see cref="IPromise"/>. | |
9 /// </summary> | |
10 /// <remarks> | |
11 /// Данный класс определяет стандартное поведение при обработки результатов, в частности | |
12 /// обработку <see cref="System.OperationCanceledException"/> и <see cref="PromiseTransientException"/> | |
13 /// </remarks> | |
14 public abstract class AbstractTask : AbstractPromise { | |
15 int m_cancelationLock; | |
16 | |
17 /// <summary> | |
18 /// Получает эксклюзивное право отмены задания, используется для отмены задания до начала его выполнения. | |
19 /// </summary> | |
20 /// <returns><c>true</c>, if cancelation was locked, <c>false</c> otherwise.</returns> | |
21 protected bool LockCancelation() { | |
22 return 0 == Interlocked.CompareExchange(ref m_cancelationLock, 1, 0); | |
23 } | |
24 | |
25 | |
26 | |
27 protected void SetErrorInternal(Exception error) { | |
28 // unwrap | |
29 while (error is PromiseTransientException && error.InnerException != null) | |
30 error = error.InnerException; | |
31 | |
32 if (error is OperationCanceledException) | |
33 SetCancelled(error); | |
34 else | |
35 SetError(error); | |
36 } | |
37 | |
38 protected void SetCancelledInternal(Exception reason) { | |
39 SetCancelled( | |
40 reason == null ? new OperationCanceledException() : reason is OperationCanceledException ? reason : new OperationCanceledException(null, reason) | |
41 ); | |
42 } | |
43 } | |
44 } | |
45 |