gpt4 book ai didi

c# - 后台人员总是很忙

转载 作者:太空狗 更新时间:2023-10-30 01:05:43 25 4
gpt4 key购买 nike

我不熟悉使用事件处理程序和后台工作程序,所以我可能在这里遗漏了一些非常明显的东西。不过,两天来我一直在努力解决这个问题,所以我想我还是看看大家有什么要说的吧。

我有一个名为 SqlExpressDownloader 的后台程序。它在我程序的开头开始运行,其余的工作运行,然后它应该等待 SqlExpressDownloader_DoWork() 方法中的操作完成,然后再继续。唯一的问题是,出于某种原因,每当我执行 while(SqlExpressDownloader.IsBusy) 时,它总是响应忙碌,因此将永远等待。

事件处理程序的代码在这里:

    private void SqlExpressDownloader_DoWork(object sender, DoWorkEventArgs e)
{
string sSource = string.Format("{0}\\{1}", Paths.Settings_Common, "sqlexpr_x64_enu.exe");
Debug.WriteLine(sSource);
Debug.WriteLine("http://www.elexioamp.com/Install/redistributables/sql2008r2express/sqlexpr_x64_enu.exe");
if (!System.IO.File.Exists(sSource))
{
WebClient oWebClient = new WebClient();
oWebClient.DownloadProgressChanged += DownloadProgressChanged;
oWebClient.DownloadDataCompleted += DownloadComplete;

oWebClient.DownloadFileAsync(new System.Uri("http://www.elexioamp.com/Install/redistributables/sql2008r2express/sqlexpr_x64_enu.exe"), sSource);

while (oWebClient.IsBusy)
{
Thread.Sleep(100);
}

e.Result = "";
DownloadFinished = true;
}
}

我看过代码,看过它完成这个方法。我什至在 DownloadFinished = true 之后添加了一个 return,但它仍然响应忙。我想知道的是如何让后台工作人员响应不忙。

编辑事件全部添加到构造函数中,如下所示:

        SqlExpressDownloader = new BackgroundWorker();
SqlExpressDownloader.DoWork += new DoWorkEventHandler(this.SqlExpressDownloader_DoWork);
SqlExpressDownloader.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.SqlExpressDownloader_RunWorkerCompleted);

RunWorkerCompleteEventHandler 如下所示:

    private void SqlExpressDownloader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Debug.WriteLine("The actions are complete.");
}
else
{
Debug.WriteLine("Error in completed work.");
}
}

但是,当我上次调试它时,它实际上并没有触发。

最佳答案

而不是查询 SqlExpressDownloader.IsBusy在一个循环中,尝试订阅 RunWorkerCompleted BackgroundWorker 事件并将您的代码放在那里,应该只在 DoWork 之后出现事件结束。

您还可以访问 RunWorkerCompletedEventArgs ,您可以检查以确保没有从 DoWork 中抛出错误。你的一部分 BackgroundWorker .

    ...
...
SqlExpressDownloader.RunWorkerCompleted += SqlExpressDownloader_RunWorkerCompleted;
SqlExpressDownloader.RunWorkerAsync();
}

private void SqlExpressDownloader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
// do something in response to the error
}

// stuff to do after DoWork has completed
}

我找到了 Joe Albahari's tutorial对我学习如何使用它们很有帮助。

关于c# - 后台人员总是很忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com