C# C语言中的线程问题#

C# C语言中的线程问题#,c#,.net,multithreading,winforms,C#,.net,Multithreading,Winforms,目前我有一个Windows窗体应用程序,我想创建一个新线程,并在另一个接受输入的类上运行一个方法 比如说 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

目前我有一个Windows窗体应用程序,我想创建一个新线程,并在另一个接受输入的类上运行一个方法

比如说

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#中执行此操作?我在网上看到了很多例子,大多数都在同一个类上运行该方法,没有参数,但没有一个适合我的要求。

也许a可以帮助你?
要理解你的目标有点难

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);
        }
    }
}

我不是多线程方面的专家,但就我所知,您只能在接受对象参数并返回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.
    }

直接使用线程池和匿名方法,允许您访问周围的本地人,怎么样

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

我已经尝试过Backgroundworker,但还没有找到如何让它发挥作用以达到我想要的效果。基本上,我想从我的winform类运行一个新线程,将参数serialInput传递到SMS类方法SMSListener。好的,为什么需要传递SMSListener类实例?共享状态?这可能会导致交叉线程问题。请澄清一下!您是否希望一个线程读取数据,然后将其放入一个队列中供主线程使用?即生产者/消费者模式?在这种情况下,一名背景工人显然是不够的。有关生产者/消费者的讨论。感谢您的帮助。设法解决了这个问题。我的问题是一个非常复杂的生产者和消费者问题。