Есть ли способ определить, какие задачи в данный момент выполняются в параллельной библиотеке задач?

StackOverflow https://stackoverflow.com/questions/1551537

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Гусейн

Другие советы

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

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();
        }
    }
};

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top