如何将参数传递给.Net中的Thread

时间:2009-09-25 06:28:23

标签: c# .net

我的功能如下:

public void view(string msg)
{
  messagebox.show(msg);
}
.

我想从一个线程向它传递参数..我正在使用.Net 1.1。我怎么能这样做?

5 个答案:

答案 0 :(得分:5)

对于.NET 1.1,没有直接的方法,但是使用同时具有the method and the state的对象,在此示例中(从MSDN示例中修改),ThreadState类被实例化并传递所需的状态,然后是其方法被调用并使其使用传递状态。

public class ThreadState {
    private string msg;

    // The constructor obtains the state information.
    public ThreadState(string msg) {
        this.msg = msg;
    }

    public void view() {
        //Do something with msg
    }
}

public class Example {
    public static void Main() {
        ThreadState ts = new ThreadState("Hello World!");
        // Create a thread to execute the task, and then
        // start the thread.
        Thread t = new Thread(new ThreadStart(ts.view));
        t.Start();
        t.Join();
    }
}

对于.NET> 1.1(原始问题没有说明版本。)

您在Start方法中传递参数。您将收到一个需要回放到正确类型的对象。

Thread t = new Thread(view);
t.Start("Hello");

public void view(object msg) 
{
     string m = (string)msg;
     //Use msg
}

或者使用ParameterizedThreadStart代表。

答案 1 :(得分:2)

ParamaterizedThreadStart委托在.NET 1.1(2003)中不存在,thread.Start也不在1.1中使用Object param。但是你可以尝试类似的东西:

dict [mythread.name] = myval; // dict是一个类范围的变量 mythread.Start();

答案 2 :(得分:1)

有各种方法可以做到这一点。一种是使用ParameterizedThreadStart委托,它允许将一个Object类型的参数传递给线程。将视图方法更改为接受Object,然后将Object转换为方法内的String。

答案 3 :(得分:0)

Vinko提供的第一个代码片段正是您在.NET 1.x中所需要的,因为原始的Threading命名空间没有提供用于参数化_beginthread的内置机制。

因此,您将创建一个包含所需数据的状态类,以及将在“new Thread()”语句中用于委托的方法,如Vinko所示。

我准备点击一个样本,然后我看到了他的示例代码。如果它“不起作用”,那么值得明确为什么,因为肉眼看来代码看起来太熟悉了。

对此的一个“旋转”是正确封装线程构造以及线程启动/连接行为。

另一种选择是使用ThreadPool.QueueUserWorkItem(),它不完全相同,如果过度使用会导致ThreadPool性能不佳。

另一种选择是创建一个在信号上被阻塞的线程,例如ManualResetEvent,在初始化数据成员时设置。目标数据成员可以像上面所示的对象引用一样简单,或者您可以使用ArrayList,Queue或Stack对象(具有适当的锁定)来实现一种“队列处理器”,其中工作项可以入队并由专用线程,专用线程保持休眠状态(阻塞等待信号),直到有可用的工作。

答案 4 :(得分:0)

创建一个类,将属性设置为参数并运行该类的相关函数。

Dim run = New Runner()
run.mile = 20
run.pace = "slow"
Thr.Start(run.Process())

或者您需要使用全局范围变量。不幸的是,没有其他方法可以用于.NET 1.1