【发布时间】: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