【问题标题】:REG Threading: How to implement ThisREG线程:如何实现这个
【发布时间】:2011-02-28 07:48:34
【问题描述】:

我有一个 Winform 应用程序,它有一个 backgroundWorker 线程并且仅通过它执行所有操作。

完成一项特定操作(即连接到服务器)后,我想创建一个监视器来检查与服务器的连接是否处于活动状态。将执行 Web 服务以找出连接并检查结果以了解。如果没有重新连接它。我相信我应该创建一个线程来监控连接。逻辑是这样的:在每个 X 秒监视器检查连接后,X 秒后再次返回并再次完成其工作,即检查连接并了解状态。我认为他们不需要阻止线程,因为我可以在得到结果时做出反应。我也不需要在这个过程中处理任何 UI。可能只需要一旦我发现连接丢失,然后必须调用重新连接的其他函数并且该线程再次重新启动或类似的东西。

我阅读了 2-3 篇教程,但不知道如何实现这一点 - 使用和调用哪种线程类型。

表单实现代码:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){    
    if (currentState == OPENING)
         LoadAfterLogin();
    else if (currentState == CONNECTING)
         Connect();    // CONNECTS TO THE SERVER
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){
    ......   
    else if (value == CONNECTED)   {
        currentState = CONNECTED;
        statusLabel.Text = "CONNECTED Successfully to server";
       //  HERE MONITOR THREAD SHOULD BE STARTED ONCE APP KNOWS FOR SURE, THAT IT IS CONNECTED TO SERVER    
       monitorConn = new MonitorConnection();   
   } else if (value == EXP)   {
       currentState = ERR_CONNECTING;
       ExceptionData ed = (ExceptionData)e.UserState;
        .....   
   }
}

////////////////////////////////////////ANOTHER MonitorConnection thread class 

public class MonitorConnection : Thread{
private DateTime startTime, lastCheckedTime;
private bool conneced;
private int intervalDuration, nextTime;

public MonitorConnection()    {
    intervalDuration = 10000;    
}
public bool IsConneced    {
    get { return conneced; }
    set { conneced = value; }
}

// SHOULD CALL THIS WHEN THE THREAD IS STARTED
public void start()    {
    startTime = DateTime.Now;
    nextTime = DateTime.Now;
}

// THIS SHOULD BE SOMEHOW CALLED BY run()
public void checkConnection()    { 
   // IS CURRENT TIME IS >= SCHEDULED NEXTTIME
    if (DateTime.Now >= nextTime) {
        // Checks if the connection to server is alive or not
        conneced = UltimateLibrary.http.HTTPUtility.isConnectionAvailable();
        lastCheckedTime = DateTime.Now;
        nextTime = lastCheckedTime + intervalDuration;
    }
}

// SOMETHING LIKE RUN - that starts the process execution
public void run() {
   while (true) {
        if (DateTime.Now >= nextTime)
            checkConnection();
        Thread.sleep(interval); 
   }
}

}

这是已实现的代码,用于显示我想要实现的逻辑。我同意并知道代码并不完全符合其标准。仍然需要通过不阻塞、以连续间隔运行等方式进行更改以使其正确。我认为应该扩展除 Thread 之外的其他类(不确定哪一个合适)。

非常感谢任何帮助。谁能给我一些提示/想法来实现上述内容。

[编辑:] 谢谢 Vinay,根据您的代码,我实现如下:- 在 MonitorConnection 类中创建了一个 Timer obj。

公共无效开始监视器() { 开始时间 = 日期时间。现在; 下一个时间 = 日期时间。现在; 计时器 = 新计时器(间隔时间); timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); GC.KeepAlive(定时器); // 我不认为这是 reqd 因为计时器是类的成员 计时器.Start(); // 也可以调用 timer.Enabled = true; }
    public static void checkConnection()
    {
        if (DateTime.Now >= nextTime) {
            // Checks if the connection to server is alive or not
            connected = UltimateLibrary.http.HTTPUtility.isConnectionAvailable();
            lastCheckedTime = DateTime.Now;
            nextTime = lastCheckedTime.AddMilliseconds(intervalDuration);
        }

    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        // Check if connection is alive
        checkConnection();
    }

。 如果已连接为假,即服务器未连接,则必须让调用表单知道这一点。我想这可以将一个表单对象传递给这个类并在连接== false时调用其各自的方法。你说什么 ?这是和上面的代码似乎是正确的吗?您的指导将受到高度赞赏。 - 谢谢

谢谢

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    为什么不为此使用Timer - 它使用起来非常简单。例如,

        public event EventHandler Disconnected;
    
    
        timer = new System.Timers.Timer(10000);
        timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        timer.Enabled = true;
    
        ...
    
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
           // check if connection is alive
           conneced = UltimateLibrary.http.HTTPUtility.isConnectionAvailable();
           if (!connected)
           { 
              // inform listeners
              var listener = Disconnected;
              if (null !- listener)
              {
                  Disconnected(EventArgs.Empty);
              }
           }
        }
    

    您只需确保在所需的持续时间内引用计时器(否则它将被垃圾收集)。

    【讨论】:

    • 感谢 VinayC,根据您的指导,我实现了代码并在问题中添加了代码。它是否正确 !尝试引导更多基于新代码和查询。 -谢谢
    • @user455979,虽然你可以参考表单并调用它的方法,但它会产生不必要的依赖——我建议它从MonitorConnection引发事件并在表单上处理它。
    • VinayC,你能帮我知道如何在 MonitorConnection 中创建一个事件并在表单中引发和处理吗?任何教程或 URL 也会有所帮助。我认为我没有任何链接可以帮助我按照您所说的进行操作。
    • 我已经编辑了我的答案 - 有关事件的更多信息,请参阅 msdn.microsoft.com/en-us/library/awbftdfh.aspx
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多