从类中调用方法
问题描述:
我正在开发串口通信应用程序。我写了一堂课。在串行端口的DataReceived事件中,我需要调用一个方法来执行一些字符串操作。我想在另一个线程中进行这些操作。从类中调用方法
但由于我的应用程序不是从应用程序的窗口(它只是一个类),它没有Invoke()方法。
那么,如何在没有Invoke()方法的类中调用方法?
谢谢
答
使用System.Threading.Thread类并通过委托传递你的方法。
编辑:
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();
}
答
我是否正确要异步调用的方法理解?如果是这样的:
Thread.QueueUserWorkItem(myCallBack)
其中myCallBack
是代表吃一个object
和返回void
。参见MSDN甚至有一个简单的例子。
答
你可以自己创建并运行一个新的线程:
Thread thread = new Thread(MyBackgroundMethod);
thread.Start();
...
public void MyBackgroundMethod()
{
...
}
答
既然你不处理的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
}
答
最简单的方法是使用BackgroundWorker的是在命名空间System.ComponentModel.BackgroundWorker。它使得后台线程上的异步操作更容易管理,并且可以添加处理程序来取消,监视进度并在工作线程完成后进行响应。以下是MSDN上的链接link text
你能解释一下吗?谢谢 – UnforgivenX 2009-12-15 20:20:21