निम्न एक्सटेंशन विधि के साथ
:
public static class EnumerableExtensions
{
public static IEnumerable<Task<TimedResult<TReturn>>> TimedSelect<TSource, TReturn>(
this IEnumerable<TSource> source,
Func<TSource, Task<TReturn>> func)
{
if (source == null) throw new ArgumentNullException("source");
if (func == null) throw new ArgumentNullException("func");
return source.Select(x =>
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Task<TReturn> task = func(x);
Task<TimedResult<TReturn>> timedResultTask = task
.ContinueWith(y =>
{
stopwatch.Stop();
return new TimedResult<TReturn>(task, stopwatch.Elapsed);
});
return timedResultTask;
});
}
}
public class TimedResult<T>
{
internal TimedResult(Task<T> task, TimeSpan duration)
{
Task = task;
Duration = duration;
}
public readonly Task<T> Task;
public readonly TimeSpan Duration;
}
और callsite
var tasks = statements.TimedSelect(statement => _session.ExecuteAsync(statement));
var result = Task.WhenAll(tasks).Result;
आप परिणाम है कि आप की आवश्यकता होगी
// Whatever works (ugly, but just as an example)...
var min = result.Select(x => x.Duration).Min();
var max = result.Select(x => x.Duration).Max();
var avg = new TimeSpan((long)result.Select(x => x.Duration.Ticks).Average());
नोट निकाल सकते हैं कि इस पूल इंतज़ार कर समय भी शामिल है (एक कार्य धागा उपलब्ध होने के लिए समय इंतजार कर रहा है), और इसके लिए सटीक नहीं हो सकता है।
इस विस्तार का एक गैर-सामान्य संस्करण पाठक के लिए एक अभ्यास है।
यह कार्य का कार्य नहीं है। स्टॉपवॉच का उपयोग करने के लिए आपको क्या रोकता है, जैसा कि [मेरे कोड को कितना समय लगता है?] (Http://stackoverflow.com/questions/1285052/how-long-does-my-code-take-to-run) – CodeCaster
मैंने स्टॉपवॉच का उपयोग करने की कोशिश की, लेकिन मुझे नहीं पता कि मैं प्रत्येक कार्य को कैसे माप सकता हूं। –
तो आप _each_ कार्य को मापना चाहते हैं, _all_ कार्यों नहीं? फिर आपको प्रत्येक कार्य में स्टॉपवॉच लागू करना होगा। – CodeCaster