Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免win表单中多个线程重复调用例程?_C#_.net_Winforms_Multithreading - Fatal编程技术网

C# 避免win表单中多个线程重复调用例程?

C# 避免win表单中多个线程重复调用例程?,c#,.net,winforms,multithreading,C#,.net,Winforms,Multithreading,我在Windows窗体中有一个私有对象变量,它执行tcp/IP套接字连接并保持连接打开 在form_load上,该对象被初始化,表单中有15-20个线程在连续运行,这些线程访问该对象。在某些情况下,Tcp/Ip连接可能会丢失。因此,每当我发现连接丢失时,我都在线程中调用重新连接到socket()方法。我正在执行以下代码,以确保通过使用\u ReconnectingSocket属性只调用一次ReconnectToSocket()方法。但是在检查文本日志文件之后,我发现这个方法是在每个子线程中调用的

我在Windows窗体中有一个私有对象变量,它执行tcp/IP套接字连接并保持连接打开

在form_load上,该对象被初始化,表单中有15-20个线程在连续运行,这些线程访问该对象。在某些情况下,Tcp/Ip连接可能会丢失。因此,每当我发现连接丢失时,我都在线程中调用重新连接到socket()方法。我正在执行以下代码,以确保通过使用\u ReconnectingSocket属性只调用一次ReconnectToSocket()方法。但是在检查文本日志文件之后,我发现这个方法是在每个子线程中调用的

如何确保此方法只调用一次并避免重复调用。

下面是我的代码。我对任何替代方法都感兴趣,因为我觉得这不是这样做的正确方法

    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; }
  }
}

Hi锁定的对象应该是类的静态私有对象,而不是实例成员。我不确定的一点是,为什么在线程之间共享相同的连接,而不是让每个线程打开、使用并立即关闭自己的连接,就像我们使用SqlConnection一样。

我需要将连接保持到底。使用连接每隔5-10秒传递一次消息和指令。因此,我不想打开和关闭连接,也不想为每个线程保留不同的对象。如果使用锁,则在5个线程同时调用例程ReconnectToSocket(),第一个线程获取锁,然后剩下的4个线程等待。第一个任务完成后,第二个任务将获取并再次执行相同的任务。我想避免这种情况。你是对的,所有线程最终都会获得一个锁,但由于
if(!reconnected)
条件,它们会在不执行任何任务的情况下释放它。让我来实现并测试这种方法。这看起来很可疑。您无法隐藏这样一个事实,即与正在积极传输数据的线程的连接已丢失。传输无法完成,必须重新启动。有些灾难影响太大,无法解决。在这里使用15个线程没有多大意义。线程为您购买了更多的cpu周期,但它不会使另一端的机器更快。