避免在一个窗体中从多个线程重复调用一个例程
本文关键字:一个 线程 调用 例程 窗体 | 更新日期: 2023-09-27 18:11:44
我在Windows窗体中有一个私有对象变量,它执行tcp/IP套接字连接并保持连接打开。
在form_load上,这个对象被初始化,并且表单中有15-20个线程在连续运行,这些线程访问这个对象。在某些情况下,Tcp/Ip连接可能会丢失。因此,每当我发现连接丢失时,我调用线程内的ReconnectToSocket()方法。我正在执行下面的代码,以确保ReconnectToSocket()方法仅通过使用_ReconnectingSocket属性调用一次。但是在检查了文本日志文件之后,我发现这个方法在每个子线程的。
如何确保这个方法只被调用一次,避免重复调用
下面是我的代码。我对任何替代方法都感兴趣,因为我觉得这不是正确的方法。
bool _bReconnectingSocket = false;//To check if it is currently reconnecting
readonly object lock_reconnectSocket = new object();
private bool _ReconnectingSocket
{
get
{
lock (lock_reconnectSocket)
{
return this._bReconnectingSocket;
}
}
set
{
lock (lock_reconnectSocket)
{
this._bReconnectingSocket = value;
}
}
}
private void ReconnectToSocket()
{
if (!this._ReconnectingSocket)
{
this._ReconnectingSocket = true;
//Each sub thread checks for this variable while looping and exits from the infinite loop
this._Stop = true;
//Join all the Sub Threads Before Reconnecting
foreach (SocketThread thrd in this._subThreadCol)
{
try
{
this._objLog.WriteInfo(string.Format("Joining Subthread - {0} for Reconnecting.", thrd.ThrdID));
thrd.Join();
}
catch { }
}
this.ConnectSocket();
this._ReconnectingSocket = false;
this._Stop = false;
}
}
尝试在您的类中编写类似的内容。您的例程仍然可能被调用多次,但如果reconnected
字段为false,则它的实际主体一次只执行一次。
bool reconnected = false;
object lockObject = new object();
void ReconnectToSocket()
{
lock(lockObject)
{
if(!reconnected) { /*do stuff*/; reconnected = true; }
}
}
嗨,你锁定的对象应该是类的静态私有对象,而不是实例成员。我不确定的一件事是为什么你在线程之间共享相同的连接,而不是让每个线程打开,消费并立即关闭自己的线程,就像我们使用SqlConnection一样。