File: Internals\System\Runtime\ScheduleActionItemAsyncResult.cs
Web Access
Project: src\src\System.ServiceModel.Primitives\src\System.ServiceModel.Primitives.csproj (System.ServiceModel.Primitives)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
 
namespace System.Runtime
{
    // An AsyncResult that schedules work for later on the IOThreadScheduler
    internal abstract class ScheduleActionItemAsyncResult : AsyncResult
    {
        private static Action<object> s_doWork = new Action<object>(DoWork);
 
        // Implement your own constructor taking in necessary parameters
        // Constructor needs to call "Schedule()" to schedule work 
        // Cache all parameters
        // Implement OnDoWork to do work! 
 
        protected ScheduleActionItemAsyncResult(AsyncCallback callback, object state) : base(callback, state) { }
 
        protected void Schedule()
        {
            ActionItem.Schedule(s_doWork, this);
        }
 
        private static void DoWork(object state)
        {
            ScheduleActionItemAsyncResult thisPtr = (ScheduleActionItemAsyncResult)state;
            Exception completionException = null;
            try
            {
                thisPtr.OnDoWork();
            }
            catch (Exception ex)
            {
                if (Fx.IsFatal(ex))
                {
                    throw;
                }
                completionException = ex;
            }
 
            thisPtr.Complete(false, completionException);
        }
 
        protected abstract void OnDoWork();
 
        public static void End(IAsyncResult result)
        {
            AsyncResult.End<ScheduleActionItemAsyncResult>(result);
        }
    }
}