【问题标题】:Invoking a method from a class从类中调用方法
【发布时间】:2009-12-15 20:14:56
【问题描述】:

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

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

那么,我怎样才能调用不Invoke() 的类中的方法?

谢谢

【问题讨论】:

    标签: c# multithreading class serial-port invoke


    【解决方案1】:

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

    Thread.QueueUserWorkItem(myCallBack)
    

    其中myCallBack 是代表吃object 并返回void。请参阅MSDN,其中甚至还有一个简单的示例。

    【讨论】:

      【解决方案2】:

      由于你不是在处理 UI,所以不需要使用Invoke 进行同步。您可以使用ThreadPoolBackgroundWorker 生成一个新线程,或者只创建一个新的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
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          使用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
          }
          

          【讨论】:

          • 你能再解释一下吗?谢谢
          【解决方案5】:

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

          Thread thread = new Thread(MyBackgroundMethod);
          
          thread.Start();
          

          ...

          public void MyBackgroundMethod()
          {
           ...
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-16
            • 2023-03-04
            • 1970-01-01
            • 2017-11-09
            • 2011-10-24
            • 1970-01-01
            相关资源
            最近更新 更多