C#将方法名传递给parameterizedthreadstart with variable
好了,伙计们,请不要因为我问这个问题而严厉地批评我 //使用系统线程C#将方法名传递给parameterizedthreadstart with variable,c#,multithreading,visual-studio-2010,pass-by-reference,C#,Multithreading,Visual Studio 2010,Pass By Reference,好了,伙计们,请不要因为我问这个问题而严厉地批评我 //使用系统线程 private void startThread() { Thread t = new Thread(ParameterizedThreadStart(setOutputBinaryWorker)); t.Start(); } 由于setOutputBinaryWorker是一个实际的、现有的方法,因此该方法工作良好。但是,我正在寻找一种将函数名
private void startThread()
{
Thread t = new Thread(ParameterizedThreadStart(setOutputBinaryWorker));
t.Start();
}
由于setOutputBinaryWorker是一个实际的、现有的方法,因此该方法工作良好。但是,我正在寻找一种将函数名作为变量传递给startThread函数的方法
由于我有限的C#经验,我怀疑这是可能的,但似乎不知道如何实现。我可以想象它应该是这样的:
// using System.Threading;
private void startThread(??datatype?? func)
{
Thread t = new Thread(ParameterizedThreadStart(func));
t.Start();
}
但我无法确定数据类型应该是什么(使用问号)。
现在,在调试时,传递的函数名弹出为
System.Object无效,setOutputBinaryWorker
这对我来说没什么意义。可以创建这些吗?尝试将参数强制转换为不起作用的(对象)
这背后的主要思想是尝试使用安全的gui线程以正确的方式写入ui元素。
现在,我已经搞定了那个部分,使用委托方法,一切都很顺利。但是当切换到当前方法(使方法名变为变量)时,我完全迷失了方向。
如果有人知道另一个更好的解决方案,或者至少是可行的解决方案,我愿意接受建议,非常乐意
提前感谢您的努力。我将使用lambda表达式
Thread t =new Thread(
() =>
{
function(anyparameter);
}
).Start();
数据类型应为具有签名的委托: void(object)-意思是一个不返回任何内容并接受对象参数的方法 例如:
delegate void TestDelegate(object o);
private void button4_Click(object sender, EventArgs e)
{
TestDelegate custom = SomeMethod;
ParameterizedThreadStart pts = new ParameterizedThreadStart(custom);
Thread thread = new Thread(pts);
thread.Start();
}
private void SomeMethod(object o)
{
MessageBox.Show("Hey!");
}
请注意,我们正在传入TestDelegate类型的变量。这使您能够在运行时将不同的方法传递给线程,只要这些方法符合委托签名
与反射配对:
// assuming class is in same assembly as this method
Assembly assembly = Assembly.GetExecutingAssembly();
// you can choose to get type from an known object instead
Type type = assembly.GetType("Test.SomeClass");
object instance = Activator.CreateInstance(type, null);
MethodInfo methodInfo = type.GetMethod("SomeMethod");
object[] parameterValues = new object[] { 1 };
methodInfo.Invoke(instance, parameterValues);
使用反射时只需注意性能。如果可以,缓存创建的对象以避免使用反射创建对象。为什么不传入参数化线程启动?另外:对于ParameterizedThreadStart版本,您不需要将值传递到Start吗?谢谢您的快速回复,是的,我需要。回答你的问题:那不行,我需要传递函数名,因为它将被包装在一个外部dll中。你将以这种方式调用什么样的方法?它们是否具有相同的签名和返回值?其思想是使用一些通用函数创建一个dll文件。其中之一是能够创建gui线程。这些方法的类型总是无效的。好吧,我很感兴趣,但这到底是做什么的呢?它以哪种方式替换我的代码?@Digitalis不使用ParameteredThreadStart,您只需传递参数OK。对不起,我想这比我的工资等级高了一点。你是说我最初要求的选择是不可能的?或者这仅仅是更快/更好/更新?@Digitalis您要求提供替代方案,这是一个事实,只有我想了解我在编码什么:)别误会,我感谢您的回答和时间,但它是如何工作的?谢谢您的回复。我确实理解的委托数据类型。但是,如果我错了,请纠正我,但是SomeMethod仍然必须是现有函数。这项练习的目的就是要消除这一点。我想设置该函数,以便将另一个类中定义的委托方法传递给它,以便与parameterizedThreadStart。PHP允许函数名作为字符串传递。因此,定义函数的方式和位置完全取决于您。在C#中是否可能出现类似的情况,或者只是不想这样做?反射是否符合您的要求?我更新了答案,加入了反思。