【问题标题】:Backgroundworker and Image后台工作者和图像
【发布时间】:2014-03-12 15:55:45
【问题描述】:

我有一个 Web 应用程序(不是 Windows 窗体),用户从列表框(选择框)中选择项目并按下“提交”按钮。提交后,应用程序形成 SQL 查询并连接到数据库填充数据表 - 转换为 html 代码并在页面上打印表格。我想要做的是在他们按下提交按钮并且表格准备好在页面上显示时显示图像(向用户显示它在后台进行查询和构建表格等的某种指示),隐藏图像.到目前为止,这就是我所做的。

BackgroundWorker bw = new BackgroundWorker();

protected void Page_Load(object sender, EventArgs e)
{          
    bw.WorkerReportsProgress = true;
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);       
}

public void SQL_Query() {...database connection and fill up data table }

protected void Submit_Button(object sender, EventArgs e)
{
    //LoadingImage.Visible = true;   //this does not work

    if (bw.IsBusy != true)
    {
        bw.RunWorkerAsync();
    }                      
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    SQL_Query();   
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if ((e.Cancelled == true))
    {
        this.tbProgress.Text = "Canceled!";
    }
    else if (!(e.Error == null))
    {
        this.tbProgress.Text = ("Error: " + e.Error.Message);
    }
    else
    {
        //when the query is completed, customize the data and print it on page as label

        LoadingImage.Visible = false;

        if (SQLQuery_Table.Rows.Count >= 1)
        {
            CustomizedTable(SQLQuery_Table);
        }

        string str = Display_Table();
        label.Text = str

    }
}

现在,代码的问题是LoadingImage.Visible = true; 在按下按钮时不会显示图像。根据我对其他关于 backgroundworker 的类似帖子的阅读,它说 UI 不能在同一个线程中工作。我不想制作任何进度条,所以对 Reportprogress 不感兴趣。简单地说,使图像在提交按钮按下时出现并在bw_RunWorkerCompleted 中消失。当用户按下提交按钮时,如何使图像出现?我想保持简单,所以如果我可以避免为 Image 创建另一个后台工作人员,那就太好了。谢谢!

【问题讨论】:

    标签: c# asp.net backgroundworker


    【解决方案1】:

    BackgroundWorker 在 ASP 应用程序中几乎没有用处。当您完成启动异步操作时,您将响应发送回客户端。 将响应发送回客户端后,您将无法再影响响应。您无法根据您描述的庄园中的异步操作结果更改 UI。

    这样做的唯一方法是从客户端发出一个新请求,该请求可以请求更新操作,从而允许服务器向客户端发送新信息。

    【讨论】:

    • 实际上,LoadingImage.Visible = false 在 bw_RunWorkerCompleted 中有效,因为我相信异步操作已完成。那么为什么我不能在执行 bw.RunWorkerAsync() 之前执行 LoadingImage.Visible = true。为什么它不起作用?
    • @user2848183 到异步操作完成时,更改响应为时已晚。它已经发送了。这里没有建立任何双向通信。客户端发出请求,服务器发送响应。这与没有客户端/服务器关系的桌面应用程序不同,您的代码可以在任何时间出于任何原因影响 UI。
    • 好的,现在说得通了。我该如何解决这个问题?我需要做 2 个后台工作人员(一个用于图像,另一个用于 sql 查询)并同步它们吗?如果您有任何示例,我将不胜感激!
    • @user2848183 正如我在回答中特别提到的,您需要让客户端继续发出新请求,以便服务器可以响应更新的信息(如果有)。
    • 我不知道如何继续向服务器发出请求。我知道 bw_ProgressChanged() 可以检查 do_work() 中的进度,所以我在那里尝试了 LoadingImage.Visible = true (这有点像 continue 请求,因为它读取进度)但不起作用。我现在迷路了。
    【解决方案2】:

    您可以像这样使用 .gif 加载图像...

    <asp:UpdateProgress id="updateProgress" runat="server">
        <ProgressTemplate>
            <div style="position: fixed; text-align: center; height: 100%; width: 100%; top:0; right: 0; left: 0; z-index: 9999999; background-color: #000000; opacity: 0.7;">
                <asp:Image ID="imgUpdateProgress" runat="server" ImageUrl="~/images/ajax-loader.gif" AlternateText="Loading ..." ToolTip="Loading ..." style="padding: 10px;position:fixed;top:45%;left:50%;" />
            </div>
        </ProgressTemplate>
    </asp:UpdateProgress>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多