1

我正在开发一个串口通信应用程序。我写了一个类。在串口的DataReceived事件中,我需要调用一个方法来做一些字符串操作。我想在另一个线程中进行这些操作。

但由于我的应用程序不是来自应用程序的窗口(它只是一个类),它没有Invoke().

那么,我怎样才能调用一个没有的类中的方法Invoke()呢?

谢谢

4

5 回答 5

4

我是否正确理解您要异步调用方法?如果是这样:

Thread.QueueUserWorkItem(myCallBack)

代表在哪里myCallBack吃饭object和返回void。请参阅MSDN,其中甚至有一个简单的示例。

于 2009-12-15T20:17:38.540 回答
2

由于您不处理 UI,因此您不需要使用Invoke来同步。您可以使用ThreadPool, aBackgroundWorker或创建一个新线程来生成一个新线程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
}
于 2009-12-15T20:20:56.690 回答
0

使用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
}
于 2009-12-15T20:17:33.767 回答
0

您可以自己创建和运行一个新线程:

Thread thread = new Thread(MyBackgroundMethod);

thread.Start();

...

public void MyBackgroundMethod()
{
 ...
}
于 2009-12-15T20:19:57.410 回答
0

最简单的方法是使用位于命名空间 System.ComponentModel.BackgroundWorker 中的 BackgroundWorker。它使管理后台线程上的异步操作变得容易,并且可以添加处理程序以在工作线程完成后取消、监视进度和响应。这是 MSDN链接文本上的链接

于 2009-12-15T20:36:05.490 回答