2009-12-15 13 views
1

Je développe une application de communication de port série. J'ai écrit un cours. Dans l'événement DataReceived du port série, j'ai besoin d'appeler une méthode pour effectuer certaines opérations de chaîne. Je veux faire ces opérations dans un autre thread.Invocation d'une méthode à partir d'une classe

Mais comme mon application n'est pas une application Windows (c'est une classe uniquement), elle n'a pas la méthode Invoke(). Donc, comment puis-je invoquer une méthode dans une classe qui n'a pas de méthode Invoke()?

Merci

Répondre

0

classe Utilisez System.Threading.Thread et passer votre méthode par un délégué.

EDIT:

class Myclass 
{ 

System.Threading.Thread t1 = new System.Threading.Thread(new ThreadStart(mymethod)); 

public void mymethod() 
{ 
// do something here 
} 

public void ExecuteMyThread() 
{ 
t1.Start(); 
} 

} 

class MainClass 
{ 
Myclass mycl = new Myclass(); 

public static void Main(string args) 
{ 
// start my thread from other class 
mycl.ExecuteMyThread(); 
} 
+0

Pouvez-vous expliquer un peu plus? Merci – UnforgivenX

4

Suis-je comprends bien que vous voulez appeler une méthode de manière asynchrone? Si oui:

Thread.QueueUserWorkItem(myCallBack) 

myCallBack est un délégué de manger un object et retour void. Voir MSDN où il y a même un exemple simple.

0

Vous pouvez créer et exécuter un nouveau thread vous:

Thread thread = new Thread(MyBackgroundMethod); 

thread.Start(); 

...

public void MyBackgroundMethod() 
{ 
... 
} 
2

Puisque vous ne traitez pas l'interface utilisateur, vous n'avez pas besoin d'utiliser Invoke pour synchroniser. Vous pouvez juste générer un nouveau fil en utilisant le ThreadPool, un BackgroundWorker ou simplement créer un nouveau Thread. Vous besoin d'appliquer un certain mécanisme de synchronisation (tel que lock ou similaire) si vous à partir de ce thread accéder aux données qui peuvent être accessibles à partir d'autres threads.

Exemple simple:

// code in your class that reads data from serial port 
string data = GetDataFromSerialPort(); 
ThreadPool.QueueUserWorkItem(DoSomeProcessing, data);  

private static void DoSomeProcessing(object state) 
{ 
    string data = state.ToString(); 
    // process data 
} 
0

La meilleure façon est d'utiliser BackgroundWorker qui est dans l'espace de noms System.ComponentModel.BackgroundWorker. Il facilite la gestion des opérations asynchrones sur un thread d'arrière-plan et permet d'ajouter des gestionnaires pour annuler, surveiller la progression et répondre une fois le thread de travail terminé. Voici le lien sur MSDN link text