避免在一个窗体中从多个线程重复调用一个例程

本文关键字:一个 线程 调用 例程 窗体 | 更新日期: 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一样。