c# - 后台人员总是很忙

标签 c# event-handling backgroundworker

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

我有一个名为 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/

相关文章:

c# - 如何将标签内容与查询中的值绑定(bind)?

c# - C#关闭窗口的方法

c# - 如何在类文件中使用BackGroundWorker?

c# - 是否可以创建具有通用事件的类?

c# - BackgroundWorker,方法

c# - BackgroundWorker.CancellationPending 线程安全如何?

c# - 编译错误 - 编译器失败,错误代码为 1

c# - 将字节位作为字符串获取

c# - 您必须添加对程序集 mscorlib 的引用,version=4.0.0

javascript - 用于编辑 Google map 折线的事件处理程序?