【发布时间】:2012-02-22 21:52:13
【问题描述】:
抱歉,这篇文章太长了,我只是想尽可能地说明我的情况。 如果您想快速了解问题的要点,请阅读粗体字并检查代码。
我使用 ClickOnce 部署 C# 应用程序,并选择让我的应用程序使用 ApplicationDeployment Class 手动检查更新,而不是让它为我检查更新。
该程序是一个专门的网络扫描程序,用于搜索我工作的公司制造的网络设备。加载主窗口后,会显示一个提示,询问用户是否要扫描网络。如果他们说是,扫描开始,可能需要一两分钟才能完成,具体取决于他们的网络设置;否则它只是等待用户执行一些操作。
我在Form_Load 中做的最后一件事是创建一个检查更新的新线程。通过大约 12 个版本,这几个月来一直运行良好,但突然停止工作。我根本没有更改更新代码,也没有更改应用启动时发生的顺序。
看着代码,我想我明白为什么它不能正常工作,并想确认我的想法是否正确。如果是这样,那就引出了一个问题,为什么它以前确实有效——但我也不太关心这个问题。
考虑以下代码:
frmMain.cs
private void Form1_Load(object sender, EventArgs e)
{
// set up ui, load settings etc
Thread t = new Thread(new ParameterizedThreadStart(StartUpdateThread));
t.Start(this);
}
private void StartUpdateThread(object param)
{
IWin32Window owner = param as IWin32Window;
frmAppUpdater.CheckForUpdate(owner);
}
frmAppUpdater.cs
public static void CheckForUpdate(IWin32Window owner)
{
if (ApplicationDeployment.IsNetworkDeployed) {
Console.WriteLine("Going to check for application updates.");
parentWindow = owner;
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
ad.CheckForUpdateCompleted += new CheckForUpdateCompletedEventHandler(ad_CheckForUpdateCompleted);
ad.CheckForUpdateProgressChanged += new DeploymentProgressChangedEventHandler(ad_CheckForUpdateProgressChanged);
ad.CheckForUpdateAsync();
// CAN/WILL THE THREAD CREATED IN FORM1_LOAD BE TERMINATED HERE???
}
}
当CheckForUpdateAsync() 回调完成时,如果没有可用的更新,则方法调用简单地返回;如果有可用的更新,我会使用一个循环来阻止,直到发生 2 件事:用户已关闭“您要扫描提示”并且当前未运行任何扫描。
循环看起来像这样,发生在ad_CheckForUpdateCompleted:
while (AppGlobals.ScanInProgress || AppGlobals.ScanPromptVisible) {
System.Threading.Thread.Sleep(5000);
}
我睡了 5 秒钟,因为我认为这是在一个单独的线程中发生的,并且它似乎运行了一段时间。
我对上述代码的主要问题是:
当从CheckForUpdate 调用ad.CheckForUpdateAsync(); 时,我在Form1_Load 中创建的线程是否终止(或者它可能终止)?我怀疑可能是因为随后的Async调用导致方法返回,然后启动另一个线程?
我感到困惑的唯一原因是因为这个方法在没有挂起应用程序的情况下工作了很长时间,现在它突然挂起,我尽最大努力调试发现是 Sleep 调用阻塞了应用程序。
如果有帮助,我很乐意发布 frmAppUpdater.cs 的完整代码。
【问题讨论】:
-
我根本没有更新 Visual Studio 或更改应用程序的目标 .NET 版本,但问题可能只发生在具有 .NET 4 客户端配置文件 SP1 的机器上。我现在正在调查。我看到问题的安装版本是
4.0.30319。我将尝试查看 .NET 4 SP(0) 上是否没有出现此问题。
标签: c# winforms multithreading clickonce