C# 如何将参数传递给.Net中的线程

C# 如何将参数传递给.Net中的线程,c#,.net,C#,.net,我的职能是: public void view(string msg) { messagebox.show(msg); } . 我想从线程向它传递参数。。我正在使用.NET1.1。如何做到这一点?对于.NET 1.1,没有直接的方法,只能使用同时具有这两个属性的对象,在本例中(根据MSDN示例修改),ThreadState类被实例化并传递所需的状态,然后调用其方法并使其使用传递的状态 public class ThreadState { private string msg;

我的职能是:

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


我想从线程向它传递参数。。我正在使用.NET1.1。如何做到这一点?

对于.NET 1.1,没有直接的方法,只能使用同时具有这两个属性的对象,在本例中(根据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
}

要么这样,要么使用委托。

对于.NET 1.1,没有直接的方法,只能使用同时具有这两个属性的对象,在本例中(根据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
}

要么这样做,要么使用委托。

有多种方法可以做到这一点。一种是使用委托,它允许将Object类型的单个参数传递给线程。将view方法更改为accept Object,然后将Object强制转换为方法内的字符串。

有多种方法可以做到这一点。一种是使用委托,它允许将Object类型的单个参数传递给线程。将视图方法更改为接受对象,然后将对象强制转换为方法内的字符串。

ParamaterizedThreadStart委托在.NET 1.1(2003)中不存在,thread.Start也不接受1.1中的对象参数。但是,您可以尝试以下方法:

dict[mythread.name]=myval//dict是类作用域变量。

mythread.Start()

ParamaterizedThreadStart委托在.NET 1.1(2003)中不存在,thread.Start在1.1中也不接受对象param。但是,您可以尝试以下方法:

dict[mythread.name]=myval//dict是类作用域变量。

mythread.Start()

Vinko提供的第一个代码片段正是.NET 1.x下所需的,因为原始线程名称空间没有提供用于参数化_beginthread的内置机制

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

我正要敲出一个示例,然后我看到了他的示例代码。如果它“不起作用”,那么有必要明确说明原因,因为用肉眼看,代码看起来太熟悉了

其中一个“技巧”是正确封装线程构造以及线程启动/连接行为

另一个选项是使用ThreadPool.QueueUserWorkItem(),这两个选项并不完全相同,如果过度使用,可能会导致线程池性能不佳


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

Vinko提供的第一个代码片段正是.NET 1.x下所需的,因为原始线程名称空间没有提供用于参数化beginthread的内置机制

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

我正要敲出一个示例,然后我看到了他的示例代码。如果它“不起作用”,那么有必要明确说明原因,因为用肉眼看,代码看起来太熟悉了

其中一个“技巧”是正确封装线程构造以及线程启动/连接行为

另一个选项是使用ThreadPool.QueueUserWorkItem(),这两个选项并不完全相同,如果过度使用,可能会导致线程池性能不佳


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

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

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

或者您需要使用全局范围变量。不幸的是,对于.NET 1.1,没有其他方法可以创建一个类,将属性设置为参数并运行该类的相关函数

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

或者您需要使用全局范围变量。不幸的是,在.NET 1.1中没有其他方法,您在新线程中执行此函数?您看到了吗?您在新线程中执行此函数了吗?您看到了吗?这不是有点不正常吗?我更喜欢使用更显式的方法,即使用一个类将参数传递给线程。这肯定有点麻烦,但在.NET 1.1中没有显式的方法将对象传递给另一个线程。这不是有点麻烦吗?我更喜欢使用更显式的方法,让一个类将参数传递给线程。这肯定有点老套,但在.NET 1.1中没有显式的方法将对象传递给另一个线程。这绝对是在.NET 1.1中最清晰的方法。(除了小写方法命名约定之外)事实上,我在较新的版本中仍然使用它,而不是将参数传递给Start,这需要