2011-05-17 123 views
2

我现在有一个Windows窗体应用程序,我想创建一个新线程并在另一个接受输入的类上运行一个方法。C#中的线程问题

例如

public partial class Form1: Form { 
    SerialPort serialInput; 
    // I want to create a new thread that will pass the parameter serialInput into the method 
    // SMSListener on another class and run the method contionously on the background. 
} 

class SMS 
{ 
    public void SMSListener(SerialPort serial1) 
    { 
     serial1.DataReceived += port_DataRecieved; 
    } 

    private void port_DataRecieved(object sender, SerialDataReceivedEventArgs e) 
    { 
     // Other codes 
    } 
} 

如何在C#中执行此?我在网上看到了很多例子,他们中的大多数都在同一个类上运行方法,没有参数,但没有一个适合我的要求。

+2

看一看[BackgroundWorker的类(http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) – digEmAll 2011-05-17 08:35:30

+0

已经尝试过,但还是搞清楚如何得到我想要的结果。 – abduls85 2011-05-17 08:43:25

回答

2

我不是多线程方面的专家,但就我所知,您只能在接受对象参数并返回void的方法上启动线程。因此,为了实现这一目标对你的问题(不要拍我失望,如果有一个更好的办法!)我会做类似

public partial class Form1: Form { 
    SerialPort serialInput; 
    // I want to create a new thread that will pass the parameter serialInput into the method 
    // SMSListener on another class and run the method contionously on the background. 
    SMS sms = new SMS(); 
    Thread t = new Thread(sms.SMSListenerUntyped); 
    t.Start(serialInput); 
} 

class SMS 
{ 
    public void SMSListenerUntyped(object serial1) { 
     if (serial1 is SerialPort) //Check if the parameter is correctly typed. 
      this.SMSListener(serial1 as SerialPort); 
     else 
      throw new ArgumentException(); 
    } 

    public void SMSListener(SerialPort serial1) 
    { 
     serial1.DataReceived += port_DataRecieved; 
    } 

    private void port_DataRecieved(object sender, SerialDataReceivedEventArgs e) 
    { 
     // Other code. 
    } 
+0

非常感谢。有效。 – abduls85 2011-05-17 08:59:46

+0

非常欢迎。很高兴我能帮上忙! – Nikhil 2011-05-17 09:04:43

4

也许Background Worker可以帮到你吗?
这很难理解你的目标。

public class Runner 
{ 
    private readonly BackgroundWorker _worker = new BackgroundWorker(); 

    public Runner() 
    { 
     _worker.DoWork += WorkerDoWork; 
    } 

    public void RunMe(int payload) 
    { 
     _worker.RunWorkerAsync(payload); 
    } 

    static void WorkerDoWork(object sender, DoWorkEventArgs e) 
    { 
     var worker = sender as BackgroundWorker; 

     while (true) 
     { 
      if (worker.CancellationPending) 
      { 
       e.Cancel = true; 
       break; 
      } 

      // Work 
      System.Threading.Thread.Sleep((int)e.Argument); 
     } 
    } 
} 
+0

我已经试过Backgroundworker,但我仍然没有想出如何让它工作以实现我想要的结果。基本上我想从我的winform类中运行一个新的线程,它将参数serialInput传递到SMS类方法SMSListener中。 – abduls85 2011-05-17 08:41:22

+0

好吧,为什么你需要传入SMSListener类实例?分享国家?这可能会导致交叉线程问题。请澄清一下! – 2011-05-17 08:43:04

+0

难道你想要一个线程读取数据,然后将它放入一个队列中供主线程使用?即**生产者/消费者模式**?在这种情况下,背景工人显然是不够的。 [看看这里](http://stackoverflow.com/questions/1371249/c-producer-consumer-pattern)关于生产者/消费者的讨论。 – 2011-05-17 08:53:12

0

如何只直接使用线程池用匿名方法让你访问你周围的当地人?

public void OnButtonClick(object sender, EventArgs e) 
    { 
     SerialPort serialInput = this.SerialInput; 
     System.Threading.ThreadPool.QueueUserWorkItem(delegate 
     { 
      SmsListener listener = new SmsListener(serialInput); 
     }); 
    }