线程和UI之间的共享变量C#

时间:2012-07-17 09:49:06

标签: c# windows multithreading

我可以安全地在两个线程之间共享这个“状态”对象吗?

    private bool status = false;

    private void uiNewThread_bootloaderStartIdSetupAuto()
    {
        while (status)
            ;
    }

以上是将从以下UI启动的新主题:

    private void uiBtnBootloaderStartIdSetupAuto_Click(object sender, EventArgs e)
    {
        if (MessageBox.Show("ID will be setup starting from 1 to 16. \n\nAfter pressing 'YES', press the orange button one-by-one on the nodes.\nThe first pressed node will have number 1, the next number 2, and so on... \n\nWhen done, hit DONE button.", "ID setup", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            status = true;
            Thread transmitConfig = new Thread(new ThreadStart(uiNewThread_bootloaderStartIdSetupAuto)); //close port in new thread to avoid 
            transmitConfig.Start();
        }
        else
        {
            Log(LogMsgType.Normal, "User cancelled");
            status = false;            
        }
    }

2 个答案:

答案 0 :(得分:4)

编译器或CPU完成的高速缓存或重新排序等优化可能会破坏您的代码。您应该声明字段volatile以防止这种情况:

private volatile bool status = false;

可能出错的一个例子是,如果两个线程在不同的内核上运行,status的值可以由轮询线程运行的核心缓存在CPU寄存器中,从而永远不会看到由另一个线程更新的值。

尝试在发布模式下构建您的应用,您应该会看到此效果。

答案 1 :(得分:0)

最好只是锁定变量,例如

private static readonly object _lock = new Object();

....

lock(_lock){
//access to boolean variable etc.
}

另一种可能性是将bool包装在Lazy中,并且对内部值的访问是线程安全的。

如果要使用无锁机制来读取和更新值,可以考虑使用Interlocked类中的方法。

信息在这里:

System.Threading.Interlocked