C# 使用分配的线程调用不同函数的多态方法

C# 使用分配的线程调用不同函数的多态方法,c#,multithreading,plugins,scheduled-tasks,mef,C#,Multithreading,Plugins,Scheduled Tasks,Mef,我有一个类,它有一组参数数量和参数类型不同的函数。我一直在试图找到一种方法,在分配的线程中调用所需函数 做这件事的简单方法是什么?我已经研究了System.Action,但这需要知道参数。我也看过了TaskFactory和TPL,但从我看到的例子来看,我无法在脑海中总结出解决方案 我最终要做的是将有限数量的线程执行的作业排队。执行的作业是简单的HTTP请求 我觉得这是以前做过的,而且有一个简单的解决方案,但我已经逃避了好几个星期。我希望有一种优雅的方式来完成它,而不是大量复杂的代码 我还试图实现

我有一个
,它有一组参数数量和参数类型不同的函数。我一直在试图找到一种方法,在分配的线程中调用所需函数

做这件事的简单方法是什么?我已经研究了
System.Action
,但这需要知道参数。我也看过了
TaskFactory
TPL
,但从我看到的例子来看,我无法在脑海中总结出解决方案

我最终要做的是将有限数量的线程执行的作业排队。执行的作业是简单的
HTTP
请求

我觉得这是以前做过的,而且有一个简单的解决方案,但我已经逃避了好几个星期。我希望有一种优雅的方式来完成它,而不是大量复杂的代码

我还试图实现
MEF
插件,让事情变得更糟

    public bool AddThreads(int numOfThreads)
    {
        try
        {
            // Exit if no plugin type is set
            if (PluginType == "") return false;

            int totalThreads = numOfThreads + threads.Count;
            for (int i = threads.Count; i < totalThreads; i++)
            {
                // Create an instance of the MEF plugin
                var task = PluginHandler.CreateInstance(PluginType);
                threads.Add(task);

                task.ThreadId = i;

                task.OnStatusChange += new TaskerPlugin.EventHandler(ChangeStatus);
                task.OnActionComplete += new TaskerPlugin.EventHandler(ReportComplete);
                task.OnActionSuccess += new TaskerPlugin.EventHandler(ReportSuccess);
                task.OnActionFailure += new TaskerPlugin.EventHandler(ReportFailure);
                task.OnActionAttempt += new TaskerPlugin.EventHandler(ReportAttempt);
                task.OnActionError += new TaskerPlugin.EventHandler(ReportError);
                task.OnActionCancelled += new TaskerPlugin.EventHandler(ReportCancellation);
                task.OnActionBegin += new TaskerPlugin.EventHandler(ReportStartOfTask);
                task.OnActionEnd += new TaskerPlugin.EventHandler(ReportEndOfTask);

                // Do work from plugin
                // This is where I'd like to call different 
                // functions possibly inside Start()
                task.Start();
            }

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
我希望最终只调用一个函数,用预定义的线程数向其中添加一个作业:

private void AddJob(string pluginName, string methodName, List<string> args)
private void AddJob(string pluginName、string methodName、List args)

我不想只使用字符串列表来放入所有参数,但我真的不知道还有其他方法。也许是一张我以后要铸造的物品清单?这两个想法都非常混乱…

我假设
AddJob
是重载方法,您需要使用不同的参数调用它

您可能需要调整
PluginHandler.CreateInstance(PluginType)
方法,以便在创建任务时执行类似操作,这将允许您在创建的任务中执行所需的任何方法

Task task = new Task(() =>
{
    classInstance.YourMethod("some param1", some other param2));
}
进一步思考

var classInstance = new YourClass();
Type type = classInstance.GetType();
MethodInfo methodInfo = type.GetMethod("AddJob");
object[] parametersArray = new object[] { "some param1", "some parma2" };
methodInfo.Invoke(methodInfo, parametersArray);
最后

Task task = new Task(() =>
{
    var classInstance = new YourClass();
    Type type = classInstance.GetType();
    MethodInfo methodInfo = type.GetMethod("AddJob");
    object[] parametersArray = new object[] { "some param1", "some parma2" };
    methodInfo.Invoke(classInstance, parametersArray);
}

如果当前的
类本身中存在
AddJob
方法,则代码可能会有一些变化。

您可以共享一些代码吗?是的,我可以!不过,所有的事件都有点难看。你有没有试过使用BackgroundWorker?它允许您将对象参数传递给自身,这可能会对您有所帮助。。看看这里:你能添加你想对你的类对象进行的示例方法调用吗?添加了我调用AddThreads函数的代码。如果我只想一次又一次地做一件事,那么我现在所做的一切都会起作用,但我也希望能够调用插件中的其他函数。
Task task = new Task(() =>
{
    var classInstance = new YourClass();
    Type type = classInstance.GetType();
    MethodInfo methodInfo = type.GetMethod("AddJob");
    object[] parametersArray = new object[] { "some param1", "some parma2" };
    methodInfo.Invoke(classInstance, parametersArray);
}