将任务作为操作的 C# 动态方法调用

标签 c# multithreading task

我不喜欢 switch 语句。但是,我无法对以下情况提出任何替代想法。请给我一个想法。

// Parses MyTask object and routes for execution at a new task
private void PerformTask(MyTask task)
{
    Action<object> taskAction = null;

    // routing
    switch (task.Command)
    {
        case "MethodX":
            taskAction = MethodX;
            break;

        case "MethodY":
            taskAction = MethodY;
            break;

        default:
            break;
    }

   if (taskAction == null)
        return;

    Task t1 = Task.Factory.StartNew(taskAction, task);
}

private void MethodX(MyTask task)
{
    // do it something
}

private void MethodY(MyTask task)
{
    // do it something different
}

// task holder struct
public struct MyTask
{
    public string Command;
    public int[] Args;
    public int Id;

    public MyTask(string command, int[] args, int id)
    {
        this.Command = command;
        this.Args = args;
        this.Id = id;
    }

}

// Gets next task as a MyTask object and performs it.
// Thread method that is polls task queue
private void DoSomeWorks()
{
   ...
   MyTask task = GetNextTask();
   PerformTask(task);
   ...
}

我有一些不同的任务应该异步运行。这些被保存为 MyTask 结构。

DoSomeWorks方法中,下一个任务从我的任务队列中取出,然后传递给PerformTask方法来执行。 PerformTask 方法(本质)确定将为任务处理哪个方法。我刚刚用 switch case 语句实现了这个路由操作。但是,我想动态地执行此操作。如何使用命令字符串动态调用方法?

我尝试过这样的事情;

MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);

但我无法从 MethodInfo 转换为 Action。嗯,我需要帮助。

编辑:
感谢您的回答。我已经尝试过这两种建议。这就是我需要的:

private void PerformTask(MyTask task)
{
  MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);

  if (methodInfo != null)
    Task.Factory.StartNew(() => methodInfo.Invoke(this, new object[] { task }));
}

我不再需要 Action 对象。因此,我可以将通用参数对象传递给方法。非常感谢

最佳答案

关于:

MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);
if (methodInfo != null)
  Task.Factory.StartNew(() => methodInfo.Invoke(this, new []{ task }));

关于将任务作为操作的 C# 动态方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334639/

相关文章:

c# - 显示另一个类中的所有项目

ios - 多线程违规留给我们的只是荣誉(失败)

c# - 长时间运行的任务与线程——性能

java - FindBugs 不接受 ANT 脚本中的 bcel.jar

c# - 终止/中止/停止使用 Task.Factory.StartNew() 创建的任务

c# - 在 ASP.NET MVC 中正确完成购物车 session 状态

c# - 带瑞典字母的 OrderBy

c - 线程不并行运行

cpu 内核与线程

c# - wpf mvvm设置焦点数据网格的特定单元格