Есть ли способ узнать, какие задачи в настоящее время выполняются в библиотеке параллельных задач? - PullRequest
4 голосов
/ 11 октября 2009

Я не вижу способа увидеть, какие задачи выполняются. Существует свойство Task.Current, но что, если выполняется несколько задач? Есть ли способ получить такую ​​информацию?

Альтернативно, есть ли встроенный способ получать уведомления, когда задача запускается или завершается?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Вы также можете получить текущую задачу (или ее родительскую задачу) с отражением:

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();
        }
    }
};
3 голосов
/ 30 октября 2009

Привет, Майк, в TPL нет открытого доступа к списку отложенных задач. Механизм, который делает его доступным для отладчика, основан на том факте, что все потоки будут заморожены во время перечисления, поэтому его нельзя использовать во время выполнения.

Да, есть встроенный способ получать уведомления о завершении задачи. Проверьте Task.ContinueWith API. По сути, этот API создает новую задачу, которая запускается при завершении целевой задачи.

Я предполагаю, что вы хотите сделать несколько быстрых отчетов / отчетов о проделанной работе, основываясь на этом, в таком случае я бы рекомендовал вам вызывать task.ContinueWith () с флагом TaskContinuationOptions.ExecuteSynchronously. Когда вы указываете, что действие продолжения будет выполняться прямо в том же потоке, когда целевая задача завершается (если вы не укажете это, задача продолжения ставится в очередь, как любая другая обычная задача).

Надеюсь, это поможет.

Гусейн

2 голосов
/ 02 сентября 2010

Вы можете создать TaskScheduler класс, производный от предоставленного. Внутри этого класса вы имеете полный контроль и можете добавлять протоколирование с любой стороны выполнения. См. Например: http://msdn.microsoft.com/en-us/library/ee789351.aspx

Вам также нужно будет использовать Taskfactory с экземпляром вашего класса в качестве планировщика.

...