我的功能如下:
public void view(string msg)
{
messagebox.show(msg);
}
.
我想从一个线程向它传递参数..我正在使用.Net 1.1。我怎么能这样做?
答案 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