【发布时间】:2009-12-15 20:14:56
【问题描述】:
我正在开发一个串口通信应用程序。我写了一个类。在串口的DataReceived事件中,我需要调用一个方法来做一些字符串操作。我想在另一个线程中进行这些操作。
但由于我的应用程序不是来自应用程序的窗口(它只是一个类),它没有Invoke()。
那么,我怎样才能调用不Invoke() 的类中的方法?
谢谢
【问题讨论】:
标签: c# multithreading class serial-port invoke
我正在开发一个串口通信应用程序。我写了一个类。在串口的DataReceived事件中,我需要调用一个方法来做一些字符串操作。我想在另一个线程中进行这些操作。
但由于我的应用程序不是来自应用程序的窗口(它只是一个类),它没有Invoke()。
那么,我怎样才能调用不Invoke() 的类中的方法?
谢谢
【问题讨论】:
标签: c# multithreading class serial-port invoke
我是否正确理解您要异步调用方法?如果是这样:
Thread.QueueUserWorkItem(myCallBack)
其中myCallBack 是代表吃object 并返回void。请参阅MSDN,其中甚至还有一个简单的示例。
【讨论】:
由于你不是在处理 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
}
【讨论】:
最简单的方法是使用位于命名空间 System.ComponentModel.BackgroundWorker 中的 BackgroundWorker。它使管理后台线程上的异步操作变得容易,并且可以添加处理程序以在工作线程完成后取消、监视进度和响应。这是MSDN上的链接link text
【讨论】:
使用System.Threading.Thread 类并通过委托传递您的方法。
编辑:
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
}
【讨论】:
您可以自己创建和运行一个新线程:
Thread thread = new Thread(MyBackgroundMethod);
thread.Start();
...
public void MyBackgroundMethod()
{
...
}
【讨论】: