2011-03-01 16 views
11

Tengo problemas al intentar crear un subproceso con ParameterizedThreadStart. Aquí está el código que tengo ahora:Problema al crear un subproceso con parámetros

public class MyClass 
{ 
    public static void Foo(int x) 
    { 
     ParameterizedThreadStart p = new ParameterizedThreadStart(Bar); // no overload for Bar matches delegate ParameterizedThreadStart 
     Thread myThread = new Thread(p); 
     myThread.Start(x); 
    } 

    private static void Bar(int x) 
    { 
     // do work 
    } 
} 

No estoy realmente seguro de lo que estoy haciendo mal ya que los ejemplos que encontré en línea parecen estar haciendo lo mismo.

Respuesta

16

Frustrante, el tipo de delegado ParameterizedThreadStart tiene una firma que acepta un parámetro object.

Usted había necesidad de hacer algo como esto, básicamente:

// This will match ParameterizedThreadStart. 
private static void Bar(object x) 
{ 
    Bar((int)x); 
} 

private static void Bar(int x) 
{ 
    // do work 
} 
3

Método Bar debe aceptar object parámetro. Deberías lanzar al int dentro. Me gustaría utilizar lambdas aquí para evitar la creación método inútil:

public static void Foo(int x) 
{ 
    ParameterizedThreadStart p = new ParameterizedThreadStart(o => Bar((int)o)); 
    Thread myThread = new Thread(p); 
    myThread.Start(x); 
} 

private static void Bar(int x) 
{ 
    // do work 
} 
7

Esto es lo que ParameterizedThreadStart parece:

public delegate void ParameterizedThreadStart(object obj); // Accepts object 

Aquí es su método:

private static void Bar(int x) // Accepts int 

Para que esto funcione, el cambio su método para:

private static void Bar(object obj) 
{ 
    int x = (int)obj; 
    // todo 
} 
3

Se espera un argumento objeto para que pueda pasar cualquier variable, entonces usted tiene que echarlo al tipo que desee:

private static void Bar(object o) 
{ 
    int x = (int)o; 
    // do work 
} 
1

Bar que tener un object en el parámetro, no un int

private static void Bar(object x) 
{ 
    // do work 
} 
3

necesita cambiar barra de

private static void Bar(object ox) 
{ 
    int x = (int)ox; 
    ... 
} 

La función se pasa a ParameterisedThreadStart necesita tener 1 solo parámetro de tipo Object. Nada más.

Cuestiones relacionadas