Вызов метода из класса - PullRequest
       14

Вызов метода из класса

1 голос
/ 15 декабря 2009

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

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

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

Спасибо

Ответы [ 5 ]

4 голосов
/ 15 декабря 2009

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

Thread.QueueUserWorkItem(myCallBack)

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

2 голосов
/ 15 декабря 2009

Поскольку вы не имеете дело с пользовательским интерфейсом, вам не нужно использовать Invoke для синхронизации. Вы можете просто создать новую тему, используя ThreadPool, a 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 голосов
/ 15 декабря 2009

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

0 голосов
/ 15 декабря 2009

Вы можете создать и запустить новую тему самостоятельно:

Thread thread = new Thread(MyBackgroundMethod);

thread.Start();

...

public void MyBackgroundMethod()
{
 ...
}
0 голосов
/ 15 декабря 2009

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

EDIT

public class MyClass
{
    var t1 = new Thread(new ThreadStart(mymethod));

    public void MyMethod() { }
    public void ExecuteMyThread() => t1.Start();
}
public class MainClass
{
    var myClass = new MyClass();
    public void Foo() => myClass.ExecuteMyThread(); // Start thread from other class
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...