好的伙计们,请不要让我狠狠地问这个问题。
//使用System.Threading;
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 Void,setOutputBinaryWorker
这对我来说并没有太多帮助。这些可以创建吗?试图将参数转换为(对象)不起作用。
这背后的主要思想是尝试使用安全的gui-thread以正确的方式写入ui元素。 现在,我已经完成了这一部分,使用委托方法,它只是花花公子。但是当切换到当前的方法(使方法名称变量)时,我只是完全迷失了。 如果有人知道另类,更好或至少有效的解决方案,我愿意接受建议,很长时间。
提前感谢您的努力。
答案 0 :(得分:2)
数据类型应该是具有签名的委托:
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);
使用Reflection时请注意性能。如果可以,请缓存创建的对象,以免使用Reflection创建对象。
答案 1 :(得分:1)
我会使用lambda表达式
Thread t =new Thread(
() =>
{
function(anyparameter);
}
).Start();