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 Void、setOutputBinaryWorker

それは私に続けることをあまり与えません。これらを作成できますか?パラメータを(オブジェクト)としてキャストしようとしましたが、機能しません。

この背後にある主なアイデアは、正しい方法でui要素に書き込むための安全なGUIスレッドを実験することです。今、私はその部分を理解しました。委任されたメソッドを使用すると、すべてがうまく機能します。しかし、現在のアプローチに切り替えると(メソッド名を変数にする)、私は完全に迷子になります。誰かが代替の、より良い、または少なくとも機能する解決策を知っているなら、私は提案を大いに受け入れます。

よろしくお願いします。

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

Reflectionを使用するときは、パフォーマンスに注意してください。可能であれば、作成したオブジェクトをキャッシュして、Reflectionを使用したオブジェクトの作成を廃止します。

于 2012-11-19T08:20:47.203 に答える
1

ラムダ式を使用します

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