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