vb.net - 在线程之间共享信息

标签 vb.net multithreading

至少可以说我是一个业余爱好者,但是我做了一些基本的程序。无论如何,我正在制作一个DVD转换机器人。硬件方面已经构建,并且可以通过串行端口很好地工作。为了使该功能正常运行,我将必须首先制作一个多线程应用程序。

该应用程序将至少需要4个线程。 2个用于2个DVD刻录机,一个用于机械手控制,一个我正在调用导演,该导演将告诉其他3个线程该怎么做。

我的问题是在这些线程之间共享数据的最佳方法是什么。我一直在研究共享类和线程锁,但是我感到自己可能已经使事情变得复杂了。我知道我可以使用数据库来传递数据,并让每个线程每隔几秒钟检查一次数据库,但这对我来说并不像这样做的正确方法。

感谢您的建议。

最佳答案

您可以将所需的任何数据传递给Thread.Start()方法。基本上,这是在线程之间共享内容的首选方式。但是,从根本上讲,如果多个线程要访问其他线程也要访问的线程,则需要建立某种锁定机制以确保没有争用问题。

假设您在全局级别上有一个在线程之间共享的类实例:

(这是C#,但您知道了)

class GlobalData {

    public string SomeProperty {get; set; }
    public int SomeOtherProperty {get; set; }

}

如果有多个线程同时访问这些属性中的任何一个(或者期望值在调用之间保持一致)的情况将很麻烦。因此,最简单的方法是创建一个由线程负责的锁定机制:
class GlobalData {

    public object Sentry = new object();

    public string SomeProperty {get; set; }
    public int SomeOtherProperty {get; set; }
}

在运行线程的代码中,您将执行以下操作(假设g_Data是该类的实例):
void SomeMethodRunningOnAThread() {
    lock (g_Data.Sentry) {
        // do stuff    
    }
}

(在VB.NET中,相当于lock的是SyncLock)

这是确保您不会遇到争用问题的最简单方法。每个线程负责确保在访问对象的内容之前尝试对对象进行锁定。

除此之外,当然还有一些方法可以解决这个问题,例如在包含全局数据的类中实现锁定逻辑。它不会变得那么复杂,因此,如果最终要实现更复杂的内容,则无论如何都必须阅读。

关于vb.net - 在线程之间共享信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645385/

相关文章:

java - 对于 JavaFX Canvas 多线程,我应该使用什么方法?

vb.net - 处理全局错误(内存不足,StackOverflow等)VB.NET

.net - 了解 VB.NET P/Invoke 声明中的 VBByRefStr

vb.net - 将VB6应用程序移植到VB.Net:谁能做到这一点?

c# - 如何检测线程是否具有 Windows 句柄?

.net - 一个应用程序中有更多 DispatcherTimers

c++ - C++ 中的范围锁

.net - 如何通过电子邮件发送使用NLog记录的错误?

vb.net - VB.NET 中正确的异常处理

c# - 在 Java/J2ME 中与 UI 线程交互