所以我需要让我的IP字符串被我程序的2个线程使用。我不太了解类和空洞,但当时我有类似的东西:
static void Main(string[] args)
{
string IP = "127.0.0.1"
}
我希望在另一个帖子中使用它:
static void th1T()
{
while (true)
{
var ping = new Ping();
ping.Send(IP);
}
}
我怎样才能让它发挥作用?我知道我做错了什么,但不知道我会用什么。
答案 0 :(得分:4)
第一个问题是IP
的范围是方法Main
。如果你真的想要分享它,你需要在某个地方IP
声明th1T
。
static string IP = "127.0.0.1"
static void Main(string[] args)
{
// do some work and start th1T()
}
static void th1T()
{
while (true)
{
var ping = new Ping();
ping.Send(IP);
}
}
即使IP
在其他主题上运行,您也可以到达th1T
。还有一些其他选项,例如,当线程启动时,将 IP注入th1T
。要做到这一点,您必须将th1T
的签名更改为:
static void th1T(object data)
你必须稍微改变一下代码:
static void th1T(object data)
{
while (true)
{
var ping = new Ping();
ping.Send(data as string);
}
}
然后你可以在另一个这样的线程上启动它:
Thread newThread = new Thread(th1T);
newThread.Start(IP);
线程是一个非常主观的主题。如果您从另一个线程引用的值是只读,就像在您的示例中一样,并且它仅由控制器(开始工作的类)设置一次,那么分享它是绝对有效的线程之间的变量。然而,许多人会争辩他们的死亡。
我们只能就这个问题发表一般性发言。例如,通常更适合注入值以避免竞争条件和死锁。但同样,这实际上取决于你对价值所做的事情。如果您正在从另一个线程设置的一个线程中读取标志,则不能注入该值。在这种情况下,您必须安全地同步值。
没有必要继续下去,因为你看到兔子洞只会变深。
答案 1 :(得分:1)
你应该重构你的方法,ping这个方法接受一个字符串作为参数:
static void th1T(string IP)
{
while (true)
{
var ping = new Ping();
ping.Send(IP);
}
}
当您拨打该方法时,请传入您的IP。
你想要做的事情相当于一个全局变量,这通常不是一个好主意。
您可以使用的另一种方法是存储值的静态类:
public static class Values
{
string IP { get; set; }
}
在你的方法中:
static void th1T()
{
while (true)
{
var ping = new Ping();
ping.Send(Values.IP);
}
}
我想补充一点,这种方法可能会产生一些问题。这样做可能不是最好的做法。
答案 2 :(得分:1)
您尚未显示如何启动线程,但在所有情况下,您都可以将字符串作为参数发送到线程。例如,如果您手动生成新线程,则可以将其作为参数传递给Start
方法:
static void Main(string[] args)
{
string IP = "127.0.0.1"
Thread t = new Thread(th1T);
t.Start(IP);
}
static void th1T(object value)
{
// The value parameter will contain the IP here
string ip = (string)value;
while (true)
{
var ping = new Ping();
ping.Send(ip);
}
}
注意th1T
方法现在如何获取一个可以转换回传递值的对象参数。在这个例子中,我们传递了一个简单的字符串值,但你可以传递任意复杂的对象。
如果您正在使用任务,您还可以传递参数:
static void Main(string[] args)
{
string IP = "127.0.0.1"
Task.Factory.StartNew(th1T, IP);
}
static void th1T(object value)
{
// The value parameter will contain the IP here
string ip = (string)value;
while (true)
{
var ping = new Ping();
ping.Send(ip);
}
}