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