C#中的线程问题

时间:2011-05-17 08:30:55

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

3 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分: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.
    }

答案 2 :(得分:0)

如何使用匿名方法直接使用ThreadPool,以便访问周围的本地人?

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