Is there a way to tell which Tasks are currently running in Task Parallel Library?

前端 未结 3 1197
小鲜肉
小鲜肉 2020-12-19 14:16

I can\'t see a way to see which tasks are running. There is the Task.Current property, but what if there are multiple tasks running? Is there a way to get this kind of infor

相关标签:
3条回答
  • 2020-12-19 14:53

    You can create a TaskScheduler class deriving from the provided one. Within that class you have full control and can add logging either side of the execution. See for example: http://msdn.microsoft.com/en-us/library/ee789351.aspx

    You'll also need to use a Taskfactory with an instance of your class as the scheduler.

    0 讨论(0)
  • 2020-12-19 14:58

    Hey Mike, there is no public way of accessing the list of pending tasks in TPL. The mechanism that makes it available for the debugger relies on the fact that all threads will be frozen at enumeration time, therefore it can't be used at runtime.

    Yes, there's a built in way to get notified whan a task completes. Check out the Task.ContinueWith APIs. Basically this API creates a new task that will fired up when the target task completes.

    I'm assuming you want to do some quick accounting / progress reporting based on this, if that's the case, I'd recommend that you call task.ContinueWith() with the TaskContinuationOptions.ExecuteSynchronously flag. When you specify that the continuation action will be run right there on the same thread when the target task finishes (if you don't specify this the continuation task is queued up like any other regular task).

    Hope this helps.

    Huseyin

    0 讨论(0)
  • 2020-12-19 15:10

    You can also get the currently running task (or a Task's parent) with reflection:

    static public class Extensions
    {
        public static Task Parent(this Task t)
        {
            FieldInfo info = typeof(Task).GetField("m_parent", 
                BindingFlags.NonPublic | BindingFlags.Instance);
            return info != null ? (Task)info.GetValue(t) : null;
        }
        public static Task Self
        {
            get
            {
                return Task.Factory.StartNew(
                    () => { },
                    CancellationToken.None,
                    TaskCreationOptions.AttachedToParent,
                    TaskScheduler.Default).Parent();
            }
        }
    };
    
    0 讨论(0)
提交回复
热议问题