| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #region License
- /* Copyright 2012 James F. Bellinger <http://www.zer7.com/software/hidsharp>
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
- #endregion
- namespace HidSharp
- {
- internal class AsyncResult<T> : IAsyncResult
- {
- private volatile bool _isCompleted;
- private ManualResetEvent _waitHandle;
- private AsyncResult(AsyncCallback callback, object state)
- {
- AsyncCallback = callback; AsyncState = state;
- }
- private void Complete()
- {
- lock (this)
- {
- if (_isCompleted) { return; }
- _isCompleted = true;
- if (_waitHandle != null) { _waitHandle.Set(); }
- }
- if (AsyncCallback != null) { AsyncCallback(this); }
- }
- internal delegate T OperationCallback();
- internal static IAsyncResult BeginOperation(OperationCallback operation,
- AsyncCallback callback, object state)
- {
- var ar = new AsyncResult<T>(callback, state);
- ThreadPool.QueueUserWorkItem(delegate (object self)
- {
- try { ar.Result = operation(); }
- catch (Exception e) { ar.Exception = e; }
- ar.Complete();
- }, ar);
- return ar;
- }
- internal T EndOperation()
- {
- while (true)
- {
- if (IsCompleted)
- {
- if (Exception != null) { throw Exception; }
- return Result;
- }
- AsyncWaitHandle.WaitOne();
- }
- }
- public AsyncCallback AsyncCallback
- {
- get;
- private set;
- }
- public object AsyncState
- {
- get;
- private set;
- }
- public WaitHandle AsyncWaitHandle
- {
- get
- {
- lock (this)
- {
- if (_waitHandle == null)
- {
- _waitHandle = new ManualResetEvent(_isCompleted);
- }
- }
- return _waitHandle;
- }
- }
- public bool CompletedSynchronously
- {
- get { return false; }
- }
- public bool IsCompleted
- {
- get { return _isCompleted; }
- }
- private Exception Exception
- {
- get;
- set;
- }
- private T Result
- {
- get;
- set;
- }
- }
- }
|