Sni.DelWoods Ответов: 1

C# custom task.run() не выполняет функцию


У меня есть очень простой пользовательский метод Task.Run ().
Использование метода .net Task.Run() работает нормально, пользовательский метод не выполняет действие.


Есть идеи?

Что я уже пробовал:

Использование:
//works
      Task.Run(() => TestTasks.CustomTasks.DummyTask());

      //does not work
      TestHelpers.Tasks.Run(TestTasks.CustomTasks.DummyTask);

Код:
namespace TestHelpers
{
    public static class Tasks
    {
        public static string Run(Action action)
        {
            try
            {
                Task.Run(() => action);
                return "ok";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }
    }
}

namespace TestTasks
{
    public static class CustomTasks
    {
        public static void DummyTask()
        {
            for (int i = 0; i < 10; i++)
                System.Threading.Thread.Sleep(100);
        }
    }
}

1 Ответов

Рейтинг:
7

TheRealSteveJudge

Вы должны заменить

Task.Run(() => action);

около
Task.Run(action);

Пожалуйста, взгляните на Task.Run Метод (System.Нарезание резьбы.Задачи) | Microsoft Docs[^]
Синтаксис таков
public static System.Threading.Tasks.Task Run (Action action);


Sni.DelWoods

Отлично, это работает. Спасибо!

Между прочим:
Почему я должен использовать этот метод напрямую, а не использовать лямбду?
Как я вижу, метод .net имеет ту же сигнатуру: Run (Action action)

И почему я должен использовать лямбду, если мой метод использует параметры?

 public static void DummyTask(string param) {...}

 TestHelpers.Tasks.Run(() => TestTasks.CustomTasks.DummyTask("My parameter"));

TheRealSteveJudge

Пожалуйста.
Согласно документации, метод 'Run' имеет в качестве параметра объект типа 'Action'.
TestHelpers Свой '.Задачи.Метод Run также имеет объект типа action в качестве параметра.

Sni.DelWoods

Да, именно это я и обнаружил. Но почему я не могу использовать метод lambda ()=>?
Я ожидал, что нет никакой разницы между моей задачей.Бег и резьба.Задачи.Задача.Выполнить.
(Просто хочу понять, что здесь происходит...Некоторые вещи просто не укладываются у меня в голове...)

Richard Deeming

Task.Run(action)
- Возвращает Task который выполняет указанное действие.
Task.Run(() => action());
- Возвращает Task который выполняет анонимный метод, который выполняет действие.
Task.Run(() => action);
- Возвращает Task<Action> который выполняет анонимный метод, который возвращается действие. Действие не выполняется.

TheRealSteveJudge

TestHelpers.Tasks.Run(new Action(TestTasks.CustomTasks.DummyTask));

это то же самое, что
TestHelpers.Tasks.Run(TestTasks.CustomTasks.DummyTask);

В
Task.Run(() => TestTasks.CustomTasks.DummyTask());
у вас есть скобки.

Нет необходимости писать " новое действие(TestTasks.Пользовательские задачи.DummyTask)' так как это избыточное явное создание делегата.