2010-03-27 5 views
1

Comment appeler une méthode avec l'en-tête ci-dessous sur un thread?Comment appelez-vous une méthode générique sur un thread?

public void ReadObjectAsync<T>(string filename) 
    { 
     // Can't use T in a delegate, moved it to a parameter. 
     ThreadStart ts = delegate() { ReadObjectAcync(filename, typeof(T)); }; 
     Thread th = new Thread(ts); 
     th.IsBackground = true; 
     th.Start(); 
    } 

    private void ReadObjectAcync(string filename, Type t) 
    { 
     // HOW? 
    } 

    public T ReadObject<T>(string filename) 
    { 
     // Deserializes a file to a type. 
    } 

Répondre

2

Je suppose que vous pouvez avoir de bonnes raisons d'utiliser un Thread sans courir, par opposition à la piscine de fil .NET, mais juste pour référence, ce qui est très facile à faire en C# 3.5+ avec la piscine de fil:

public void ReadObjectAsync<T>(string filename, Action<T> callback) 
{ 
    ThreadPool.QueueUserWorkItem(s => 
    { 
     T result = ReadObject<T>(fileName); 
     callback(result); 
    }); 
} 

Je mets le callback là-bas parce que je suppose que vous voulez probablement faire quelque chose avec le résultat; votre exemple original (et la réponse acceptée) ne permet pas vraiment d'y accéder.

Vous invoquez cette méthode:

ReadObjectAsync<MyClass>(@"C:\MyFile.txt", c => DoSomethingWith(c)); 
2

Pourquoi ne pouvez-vous faire exactement cela ...

public void ReadObjectAsync<T>(string filename) 
    { 
     ThreadStart ts = delegate() { ReadObject<T>(filename); }; 
     Thread th = new Thread(ts); 
     th.IsBackground = true; 
     th.Start(); 
    } 

    private void ReadObject<T>(string filename) 
    { 
     // Deserializes a file to a type. 

    } 
+0

Oui, je viens de remarquer que. Il semble fonctionner correctement. –

+0

Hé, tu m'as battu. Cela ressemble à ça devrait fonctionner très bien pour moi aussi. –

1

Il serait facile de faire ce vraiment générique ...

public void RunAsync<T, TResult>(Func<T, TResult> methodToRunAsync, T arg1, 
    Action<TResult> callback) 
{ 
    ThreadPool.QueueUserWorkItem(s => 
    { 
     TResult result = methodToRunAsync(arg1); 
     callback(result); 
    }); 
} 
+0

pourriez-vous donner quelques exemples d'appel? –

Questions connexes