1

好吧,伙计们,请不要因为我问这个问题而对我失望。

// 使用 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 无效,setOutputBinaryWorker

这并没有给我太多的继续。这些可以创建吗?尝试将参数转换为 (object) 不起作用。

这背后的主要思想是尝试使用安全的 gui 线程以正确的方式写入 ui 元素。现在,我已经完成了那部分,使用委托方法,这一切都很好。但是当切换到当前方法(使方法名称可变)时,我完全迷失了。如果有人知道替代方案、更好的解决方案,或者至少是可行的解决方案,我愿意接受建议,很重要。

提前感谢您的努力。

4

2 回答 2

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

使用反射时请注意性能。如果可以的话,缓存创建的对象以取消使用反射创建对象。

于 2012-11-19T08:20:47.203 回答
1

我会使用 lambda 表达式

Thread t =new Thread(
 () =>
  {
    function(anyparameter);
  }
 ).Start();
于 2012-11-18T20:28:04.503 回答