2011-03-01 20 views
11

ParameterizedThreadStart ile bir iş parçacığı oluşturmaya çalışırken sorun yaşıyorum.Parametre oluşturulmuş bir konu oluşturma sorunu

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 
    } 
} 

İnternet'te bulduğum örnekler aynı şeyi yapıyor gibi görünmektedir beri yanlış yapıyorum gerçekten emin değilim: İşte şimdi sahip kod.

cevap

16

ParameterizedThreadStart Temsilci türü, bir object parametresini kabul eden bir imzayı işaret ediyor.

Temelde, böyle bir şey yapmak gerekir:

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

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

Yöntem Barobject parametreyi kabul etmelidir. İçinde int'a gitmelisiniz.

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

bu eser değişikliği yapmak için: Burada

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

sizin yöntemdir: Bu gibi ParameterizedThreadStart benzediğini olduğunu

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

: Ben yararsız yöntemi yaratmaktan kaçınmak için buraya lambdas kullanırsınız yönteminiz için:

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

Bar parametresinde bir object değil, bir int

private static void Bar(object x) 
{ 
    // do work 
} 
3
almalıdır: Herhangi bir değişken geçirebilirsiniz böylece bir nesne argüman bekliyor, sonra istediğiniz türü için döküm var

sen 1 tek parametre olması

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

için size ihtiyacı ParameterisedThreadStart geçirmek işlevi Bar değiştirmeniz gerekir Nesne türü. Başka hiçbir şey.

İlgili konular