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#中是否可能出现类似的情况,或者只是不想这样做?反射是否符合您的要求?我更新了答案,加入了反思。