如何在多个线程中使用字符串

时间:2013-12-31 14:40:55

标签: c# multithreading ip ping void

所以我需要让我的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);
        }
    }

我怎样才能让它发挥作用?我知道我做错了什么,但不知道我会用什么。

3 个答案:

答案 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);
    }
}