1

メンバー関数用の新しいスレッドを作成したいと思います。私は現在このコードを使用していますが、

Thread thread = new Thread(new ThreadStart(c.DoSomethingElse));
thread.Start();

そしてそれは働いています。しかし、メンバー関数をパラメーター化したいと思います。

私はこのクラスを持っています:

class C1 {
  public void DoSomething() {}
  public void DoSomethingElse() {}

  public delegate void myDelegate(C1 c);
}

次に、他のクラスにこの関数があります。

public void myFunction(C1.myDelegate func) {
  C1 c = new C1();

  func(c);  // this is working

  // but I want that the called function runs in it's own thread
  // so I tried...
  Thread thread = new Thread(new ThreadStart( func(c) ); // but the compile wants a
  thread.Start();                                        // method name and not a delegate
}

次のように myFunction を呼び出します...

myFunction( (c) => c.DoSomething() );

これを行うことは可能ですか。つまり、デリゲートを渡し、オブジェクト func(c) で呼び出すことができます。そして、object.memberfunction を渡す新しいスレッドを作成できます。しかし、 memberfunction デリゲートを使用して ThreadStart 関数に渡すことで、両方を組み合わせる方法がわかりません。ヒントはありますか?

4

5 に答える 5

3

別のオーバーロードを使用する必要がありますThread.Start(parameter)

new Thread(c.DoSomethingElseWithParameter).Start(someparameter);

編集:

あなた自身の代理人のためにこれを試してください。

   Thread thread = new Thread(() =>  func(c));
   thread.Start();

注:またはvoid MethodName(object obj)を使用しない場合は、メソッド シグネチャを にする必要があります。LambdaAnonymous method

于 2013-07-23T21:17:54.860 に答える
2

あなたはただ行うことができます:

Thread thread = new Thread(new ThreadStart(() => func(c));
于 2013-07-23T21:17:49.143 に答える
2

4.0 にアクセスできる場合は、Task Parallel Library を使用することをお勧めします。コードに基づく例を次に示します。

class TPL
{
    public delegate void myDelegate(object cgf);

    public static void Test(myDelegate func)
    {
        object c = new object();
        Task t = new Task(() => func(c));
        t.Start();
    }
}

ここにリンクがありますhttp://msdn.microsoft.com/en-us/library/dd537609.aspx

于 2013-07-23T21:19:15.340 に答える
1

TPL、特にStartNew Methodは一見の価値があります。明示的なスレッドの代わりにスレッドプールを使用するため、パフォーマンスがさらに向上する可能性があります。

パラメータとしてラムダ式を渡すことができます。私はそれをやった、スムーズに働いた。

于 2013-07-23T21:17:34.767 に答える