c# - ThreadStart with Parameter 方法

标签 c# winforms multithreading

我正在尝试学习 .Net 中的线程。

你们中的许多人一定见过这个:

private void button1_Click(object sender, EventArgs e)
{
    Thread t = new Thread(new ThreadStart(loop));
    t.Start();
}

private void loop()
{
    for (int i = 0; i < 100000; i++)
    {
        textBox1.Text = i.ToString();
    }
}

它工作正常,但是如果我的循环方法中有参数怎么办,比如:

private void loop(string str)
{
    for (int i = 0; i < 100000; i++)
    {
        textBox1.Text = i + str;
    }
}

然后如何在我的 ThreadStart 中调用此方法,因为 ThreadStart 只接受方法名称。那么如何在不同的线程中调用loop方法呢?

最佳答案

Thread t = new Thread(new ParameterizedThreadStart(loop));
t.Start("Hello world");

private void loop(object obj)
{
    string str = (string)obj;

    for (int i = 0; i < 100000; i++)
    {
        // Don't do this: you can't change a control from another thread. Danger Will Robinson!
        textBox1.Text = i + str;
    }
}

请注意,loop 方法必须接受一个object 参数,因此您必须将object 向上转换为您的类型。如果你不想,你可以使用闭包和匿名方法:

string str = "Hello world";
Thread t = new Thread(() => {
    for (int i = 0; i < 100000; i++)
    {
        // Don't do this: you can't change a control from another thread. Danger Will Robinson!   
        textBox1.Text = i + str;
    }
});
t.Start();

通过这种方式,匿名方法将“关闭”str 并且它将类似,就好像您已经传递了参数一样。 相似 因为关闭变量存在差异/问题。实际上我会写类似这样的东西:

string str = "Hello world";

{
    string str2 = str;

    Thread t = new Thread(() => {
        for (int i = 0; i < 100000; i++)
        {
            // Don't do this: you can't change a control from another thread. Danger Will Robinson! 
            textBox1.Text = i + str2;
        }
    });

    t.Start();
}

这样就没有其他人可以“触摸”str2

如果你需要,我可以在 SO 上找到一些解释这个“问题”的答案

关于c# - ThreadStart with Parameter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7812748/

相关文章:

winforms - 在 Windows Mobile 上关闭窗口 [X] 按钮而不是最小化

c# - 禁用部分 SaveFileDialog

.net - 如何使用 Alt + 字母聚焦文本框

在 boost::shared_ptr operator bool() 上旋转时需要 C++ volatile?

java - 服务器上的多线程应用程序比单线程慢(与 JUnit 测试不同)

c# - 如何同步运行异步枚举器方法并将其存储为 IEnumerable?

C# 等效于 MessageBoxA(HWND_DESKTOP, msg, "Alarm", MB_OK | MB_ICONWARNING | MB_SYSTEMMODAL | MB_SETFOREGROUND);

ruby - `threadsafe!` rails 中缺少方法

c# - 如何将默认密码嵌入到每次安装都不同的 C# 应用程序中?

c# - post 方法是否可以在继续该方法之前向用户返回确认框?