 
 public class SDTask<Result> : SDAtomic {
     
-    private let sem: dispatch_semaphore_t = dispatch_semaphore_create(0)
-    
     private var _notify: [(Result) -> Void] = []
     
     private var _lck: SDSpinLock = SDSpinLock()
+    
+    private var token: dispatch_once_t = 0
     private var _result: Result?
     
     private init(queue: dispatch_queue_t, suspend: ((Result) -> Bool)?, block: () -> Result) {

                _self._notify = []
            } else {
                let result = block()
                _self._lck.synchronized { _self._result = result }
                dispatch_semaphore_signal(_self.sem)
                _self.signal()
            }
        }

    
    /// Result of task.
    public final var result: Result {
        dispatch_once(&token) { self.block(self) }
        return self._result!
    }
}
