हम async संचालन को क्रियान्वित करने के लिए कुछ उपकरण वर्ग बनाया है।
ये विधियां वास्तव में क्या करती हैं: कार्रवाई को असीमित रूप से निष्पादित करें और फिर सिंक्रनाइज़ेशन संदर्भ के अनुसार पूर्णता के निष्पादन को पोस्ट करें।
हमने इसे टीपीएल के आवरण के रूप में आसानी से उपयोग करने के लिए बनाया है जब हम लंबे समय तक चल रहे संचालन को कॉल करते हैं। इस वर्ग में उन कार्रवाइयों के अनुरूप भी हैं जिन्हें रद्द किया जा सकता है, न केवल त्याग दिया जाता है।
public static class AsyncExecutor
{
public static CancellationTokenSource ExecuteBlockingOperation(Action action, Action completition, Action<AggregateException> onException)
{
if (action == null)
throw new ArgumentNullException("action");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task(action, TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition();
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn>(Action<TIn> action, TIn parameter, Action<TIn> completition, Action<AggregateException, TIn> onException)
{
if (action == null)
throw new ArgumentNullException("action");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task(() => action(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TOut>(Func<TOut> func, Action<TOut> completition, Action<AggregateException> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(func, TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(asyncPart.Result);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TOut, TIn> completition, Action<AggregateException, TIn> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(asyncPart.Result, parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TOut> completition, Action<AggregateException, TIn> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(asyncPart.Result);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TIn> completition, Action<AggregateException, TIn> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action completition, Action<AggregateException, TIn> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition();
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TIn> completition, Action<AggregateException> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TOut, TIn> completition, Action<AggregateException> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(asyncPart.Result, parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TOut> completition, Action<AggregateException> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition(asyncPart.Result);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static CancellationTokenSource ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action completition, Action<AggregateException> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var cts = new CancellationTokenSource();
var token = cts.Token;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (!token.IsCancellationRequested)
completition();
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
return cts;
}
public static void ExecuteBlockingOperation(Action action, Action completition, Func<bool> shouldComplete, Action<AggregateException> onException)
{
if (action == null)
throw new ArgumentNullException("action");
if (completition == null)
throw new ArgumentNullException("completition");
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task(action, TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (shouldComplete == null || shouldComplete())
completition();
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
}
public static void ExecuteBlockingOperation<TIn>(Action<TIn> action, TIn parameter, Action<TIn> completition, Predicate<TIn> shouldComplete, Action<AggregateException, TIn> onException)
{
if (action == null)
throw new ArgumentNullException("action");
if (completition == null)
throw new ArgumentNullException("completition");
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task(() => action(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPart =>
{
if (shouldComplete == null || shouldComplete(parameter))
completition(parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
}
public static void ExecuteBlockingOperation<TOut>(Func<TOut> func, Action<TOut> completition, Predicate<TOut> shoudComplete, Action<AggregateException> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(func, TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
task.ContinueWith(asyncPartTask =>
{
if (shoudComplete == null || shoudComplete(asyncPartTask.Result))
completition(asyncPartTask.Result);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
}
public static void ExecuteBlockingOperation<TIn, TOut>(Func<TIn, TOut> func, TIn parameter, Action<TOut, TIn> completition, Func<TOut, TIn, bool> shouldComplete, Action<AggregateException, TIn> onException)
{
if (func == null)
throw new ArgumentNullException("func");
if (completition == null)
throw new ArgumentNullException("completition");
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = new Task<TOut>(() => func(parameter), TaskCreationOptions.LongRunning);
task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); // on Exception
task.ContinueWith(asyncPart =>
{
if (shouldComplete == null || shouldComplete(asyncPart.Result, parameter))
completition(asyncPart.Result, parameter);
},
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
task.Start();
}
}
टास्क.रुन .NET 4.0 में मौजूद नहीं है। – JPProgrammer
.NET 4 के लिए Task.Factory.StartNew का उपयोग करें –