2009-12-15 4 views
1

Я разрабатываю приложение связи с последовательным портом. Я написал класс. В событии DataReceived в последовательном порту мне нужно вызвать метод для выполнения некоторых строковых операций. Я хочу сделать эти операции в другом потоке.Вызов метода из класса

Но поскольку мое приложение не является окном из приложения (это только класс), он не имеет метода Invoke().

Итак, как я могу вызвать метод в классе, который не имеет метода Invoke()?

Благодаря

ответ

0

класс Используйте System.Threading.Thread и передавать свой метод через делегат.

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

Не могли бы вы объяснить немного больше? благодаря – UnforgivenX

4

Am Я правильно, что вы хотите вызвать метод асинхронно понимания? Если это так:

Thread.QueueUserWorkItem(myCallBack) 

где myCallBack является делегатом ест object и возвращение void. См. MSDN, где есть простой пример.

0

Вы можете создать и запустить новый поток себя:

Thread thread = new Thread(MyBackgroundMethod); 

thread.Start(); 

...

public void MyBackgroundMethod() 
{ 
... 
} 
2

Поскольку вы не имеете дело с UI, вам не нужно использовать Invoke для синхронизации. Вы можете просто создать новый поток, используя ThreadPool, BackgroundWorker или просто создать новый Thread. Вам потребуется, чтобы применить какой-либо механизм синхронизации (например, lock или аналогичный), если вы используете данные этого потока, к которым можно получить доступ и из других потоков.

Простой пример:

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

Самый простой способ заключается в использовании BackgroundWorker, который находится в пространстве имен System.ComponentModel.BackgroundWorker. Он упрощает управление асинхронными операциями в фоновом потоке, и обработчики могут быть добавлены для отмены, отслеживания хода выполнения и ответа после завершения рабочего потока. Вот ссылка на MSDN link text

 Смежные вопросы

  • Нет связанных вопросов^_^