后台工作人员总是很忙

ijb*_*109 5 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

        SqlExpressDownloader = new BackgroundWorker();
        SqlExpressDownloader.DoWork += new DoWorkEventHandler(this.SqlExpressDownloader_DoWork);
        SqlExpressDownloader.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.SqlExpressDownloader_RunWorkerCompleted);
Run Code Online (Sandbox Code Playgroud)

看起来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.");
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*x S 1

您可以用更优雅的异步/等待解决方案替换代码,如下所示

private async Task SqlExpressDownloadAsync()
{
    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;
        await oWebClient.DownloadFileTaskAsync(new System.Uri("http://www.elexioamp.com/Install/redistributables/sql2008r2express/sqlexpr_x64_enu.exe"), sSource);  
    }   
}
Run Code Online (Sandbox Code Playgroud)