Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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# Form_Load中的线程-应用程序现在突然挂起_C#_Winforms_Multithreading_Clickonce - Fatal编程技术网

C# Form_Load中的线程-应用程序现在突然挂起

C# Form_Load中的线程-应用程序现在突然挂起,c#,winforms,multithreading,clickonce,C#,Winforms,Multithreading,Clickonce,很抱歉,这篇文章太长了,我只是想尽可能好地说明我的情况阅读粗体项目,如果您想快速了解问题要点,请检查代码。 我使用ClickOnce部署C#应用程序,并选择让我的应用程序使用手动检查更新,而不是让它为我执行更新检查 该程序是一个专门的网络扫描仪,用于搜索我工作的公司生产的网络设备。加载主窗口后,将显示提示,询问用户是否要扫描网络。如果他们说是,扫描开始,可能需要一两分钟才能完成,具体取决于他们的网络设置;否则,它只是等待用户执行一些操作 我在Form_Load中做的最后一件事是创建一个检查更新的

很抱歉,这篇文章太长了,我只是想尽可能好地说明我的情况阅读粗体项目,如果您想快速了解问题要点,请检查代码。

我使用ClickOnce部署C#应用程序,并选择让我的应用程序使用手动检查更新,而不是让它为我执行更新检查

该程序是一个专门的网络扫描仪,用于搜索我工作的公司生产的网络设备。加载主窗口后,将显示提示,询问用户是否要扫描网络。如果他们说是,扫描开始,可能需要一两分钟才能完成,具体取决于他们的网络设置;否则,它只是等待用户执行一些操作

我在
Form_Load
中做的最后一件事是创建一个检查更新的新线程。在大约12个版本中,这一切都正常工作了几个月,现在突然停止工作。我根本没有更改更新代码,也没有更改应用程序启动时发生的事情的顺序

盯着代码看,我想我明白了为什么它不能正常工作,并想确认我认为的是否正确。如果是这样的话,它就引出了一个问题:为什么它以前能工作?但我也不太关心这个问题。

考虑以下代码:

frmMain.cs frmappudater.cs 当
CheckForUpdateAsync()
回调完成时,如果没有可用的更新,则方法调用只返回;如果有更新可用,我会使用一个循环来阻止,直到发生两件事:用户已取消“您想扫描提示”并且当前没有扫描正在运行

循环看起来像这样,它发生在
ad\u CheckForUpdateCompleted
中:

while (AppGlobals.ScanInProgress || AppGlobals.ScanPromptVisible) {
    System.Threading.Thread.Sleep(5000);
}
我睡了5秒钟,因为我认为这是在一个单独的线程中发生的,并且它似乎在一段时间内运行良好

关于上述代码,我的主要问题是:
ad.CheckForUpdateAsync()时CheckForUpdate
调用code>,我在
Form1\u Load
中创建的线程是否终止(或者可能终止)?我怀疑这可能是因为随后的异步调用导致该方法返回,然后启动另一个线程

我感到困惑的唯一原因是,这个方法在没有挂起应用程序的情况下工作了很长时间,而现在它突然挂起,我在调试时尽了最大努力发现是睡眠呼叫阻塞了应用程序

如果有帮助的话,我很乐意发布frmappudater.cs的完整代码

ad.CheckForUpdateAsync()时是从CheckForUpdate调用的
我在Form1\u Load中创建的线程终止(或者可能终止)

如果
checkforupdatesync()
调用是异步的,那么是,线程将终止,否则不会终止

如果您怀疑
睡眠
导致应用程序挂起,则这两个变量
AppGlobals.ScanInProgress
AppGlobals.ScanPromptVisible
可能总是设置为
!您应该开始查看将它们设置为
true
的代码,并查看那里发生了什么

为了避免应用程序挂起,可以引入一个变量以避免无限期休眠:

int nTrials = 0;
while ((AppGlobals.ScanInProgress || AppGlobals.ScanPromptVisible) && (nTrials < 5)) {
    System.Threading.Thread.Sleep(5000);
    nTrials++;
}
// Check the results and act accordingly
intntrials=0;
while((AppGlobals.ScanInProgress | | AppGlobals.ScanPromptVisible)和&(nTrials<5)){
系统线程线程睡眠(5000);
nTrials++;
}
//检查结果并采取相应行动
我个人不喜欢使用
Sleep
进行线程同步。NET提供了一系列非常适合线程同步的工具,
WaitHandle
就是其中之一

您的表单加载方法似乎正在执行同步工作。您提到您正在使用clickonce部署。在上一版本后二进制位置是否已更改,或者对此资源的权限是否已更改。看起来线程中的工作(检查更新)从未完成,也从未返回表单

作为一个即时解决方案,我会将线程方法更改为委托-如果您使用委托,那么这就不再是客户问题(表单将响应最终用户),但潜在的问题仍然存在


作为下一步,我将进行故障排除

我根本没有更新Visual Studio或更改应用程序的目标.NET版本,但问题可能只发生在具有.NET 4客户端配置文件SP1的计算机上。我现在正在调查。出现问题的安装版本是
4.0.30319
。我将尝试查看该问题是否在.NET 4 SP(0)上发生。谢谢,我将对此进行调查。我与Wireshark确认,新版本的应用程序清单和部署文件确实由应用程序下载。我认为该线程现在正在连接到主线程,而之前不是出于某种原因。clickonce应用程序的二进制文件和权限没有更改-因为我确认清单正在下载,
ad.CheckForUpdateAsync()
现在让我觉得线程已经终止,现在异步回调正在主线程上发生,而以前没有发生过。我正在调查这是否是由于.NET 4 SP1更新造成的。据我所知,该程序甚至已经没有那么远了——如果有,它现在正在主UI线程中运行该循环,而不是在我们以前没有遇到过这个问题的地方。这些值确实会更改为false,但现在应用程序挂起,它再也不会挂起那么远,因为它不会响应Yes/No提示符上的输入。
System.Threading.Thread.Sleep(5000),因为它将导致应用程序至少挂起5秒(如果它只循环一次)
while (AppGlobals.ScanInProgress || AppGlobals.ScanPromptVisible) {
    System.Threading.Thread.Sleep(5000);
}
int nTrials = 0;
while ((AppGlobals.ScanInProgress || AppGlobals.ScanPromptVisible) && (nTrials < 5)) {
    System.Threading.Thread.Sleep(5000);
    nTrials++;
}
// Check the results and act accordingly