Listing 1: An implementation of IAsynchResult

public interface IAsyncResult
{
object AsyncState { get; }
WaitHandle AsyncWaitHandle { get; }
bool CompletedSynchronously { get; }
bool IsCompleted { get; }
}
¬ public class AsynchResult<TArg, TResult> : IAsyncResult
{
private readonly AsyncCallback m_asynchCallBack;
private readonly Object m_asychState;
private int m_completedState;
private ManualResetEvent m_asynchWaitHandle;
private Exception m_exception;
private TResult m_result = default(TResult);
private TArg m_arg = default(TArg);

public TArg Arg { get { return m_arg; } }

public AsynchResult(TArg arg, AsyncCallback callback, Object state)
{
m_arg = arg;
m_asynchCallBack = callback;
m_asychState = state;
}

public void SetAsCompleted(TResult result, bool completedSynchronously, Exception exception)
{
m_result = result;
m_exception = exception;

int previous = Interlocked.Exchange(ref m_completedState,
completedSynchronously ? (int) AsynchronousState.CompletedSychronously : (int) AsynchronousState.
CompletedAsynchronously);

if (previous != (int)AsynchronousState.Pending)
{
throw new InvalidOperationException("A result has already been set");
}

if (m_asynchWaitHandle != null)
{
m_asynchWaitHandle.Set();
}

if (m_asynchCallBack != null)
{
m_asynchCallBack(this);
}
}

public TResult EndInvoke()
{
if (!IsCompleted)
{
AsyncWaitHandle.WaitOne();
AsyncWaitHandle.Close();
m_asynchWaitHandle = null;
}

if (m_exception != null)
{
throw m_exception;
}

return m_result;
}

#region IAsyncResult Members

public object AsyncState
{
get
{
return m_asychState;
}
}

public System.Threading.WaitHandle AsyncWaitHandle
{
get
{
if (m_asynchWaitHandle == null)
{
bool done = IsCompleted;
ManualResetEvent resetEvent = new ManualResetEvent(done);

if (Interlocked.CompareExchange(ref m_asynchWaitHandle, resetEvent, null)
!= null)
{
resetEvent.Close();
}
else
{
if (!done && IsCompleted)
{
m_asynchWaitHandle.Set();
}
}
}

return m_asynchWaitHandle;
}
}

public bool CompletedSynchronously
{
get
{
return Thread.VolatileRead(ref m_completedState) == (int)AsynchronousState.CompletedSychronously;
}
}

public bool IsCompleted
{
get { return Thread.VolatileRead(ref m_completedState) != (int)AsynchronousState.Pending; }
}

#endregion
}

About the Author

Eric Vogel is a Senior Software Developer for Red Cedar Solutions Group in Okemos, Michigan. He is the president of the Greater Lansing User Group for .NET. Eric enjoys learning about software architecture and craftsmanship, and is always looking for ways to create more robust and testable applications. Contact him at vogelvision@gmail.com.

comments powered by Disqus

Featured

  • Visual Studio Code Dev Team Cleans Up

    The Visual Studio Code development team focused on some housekeeping in the October update, closing more than 4,000 issues on GitHub, where the cross-platform, open-source editor lives.

  • ML.NET Model Builder Update Boosts Image Classification

    Microsoft announced an update to the Model Builder component of its ML.NET machine learning framework, boosting image classification and adding "try your model" functionality for predictions with sample input.

  • How to Do Naive Bayes with Numeric Data Using C#

    Dr. James McCaffrey of Microsoft Research uses a full code sample and screenshots to demonstrate how to create a naive Bayes classification system when the predictor values are numeric, using the C# language without any special code libraries.

  • Vortex

    Open Source 'Infrastructure-as-Code' SDK Adds .NET Core Support for Working with Azure

    Pulumi, known for its "Infrastructure-as-Code" cloud development tooling, has added support for .NET Core, letting .NET-centric developers use C#, F# and VB.NET to create, deploy, and manage Azure infrastructure.

  • .NET Framework Not Forgotten: Repair Tool Updated

    Even though Microsoft's development focus has shifted to the open-source, cross-platform .NET Core initiative -- with the aging, traditional, Windows-only .NET Framework relegated primarily to fixes and maintenance such as quality and reliability improvements -- the latter is still getting some other attention, as exemplified in a repair tool update.

.NET Insight

Sign up for our newsletter.

Terms and Privacy Policy consent

I agree to this site's Privacy Policy.

Upcoming Events