代码之家  ›  专栏  ›  技术社区  ›  maxy

如何在.NET中将参数传递给线程

  •  1
  • maxy  · 技术社区  · 15 年前

    我在这些方面发挥了作用:

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

    .

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

    5 回复  |  直到 15 年前
        1
  •  5
  •   Vinko Vrsalovic    15 年前

    对于.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 代表。

        2
  •  2
  •   Matt Wrock    15 年前

    .NET 1.1(2003)中不存在ParamatedThreadStart委托,线程也不存在。Start在1.1中获取对象参数。不过,您可以尝试以下方法:

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

        3
  •  1
  •   Martin v. Löwis    15 年前

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

        4
  •  0
  •   dr. evil    15 年前

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

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

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

        5
  •  0
  •   wilson0x4d    15 年前

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

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

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

    其中一个“旋转”是为了正确封装线程结构以及线程启动/连接行为。

    另一个选项是使用threadpool.queueUserWorkItem(),这与实际情况不完全相同,如果使用过度,可能导致threadpool性能不佳。

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