C#使用变量将方法名称传递给parameterizedthreadstart

时间:2012-11-18 20:22:47

标签: c# multithreading visual-studio-2010 pass-by-reference

好的伙计们,请不要让我狠狠地问这个问题。

//使用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元素。 现在,我已经完成了这一部分,使用委托方法,它只是花花公子。但是当切换到当前的方法(使方法名称变量)时,我只是完全迷失了。 如果有人知道另类,更好或至少有效的解决方案,我愿意接受建议,很长时间。

提前感谢您的努力。

2 个答案:

答案 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();