【问题标题】:Enable and disable button while running thread in asp.net在asp.net中运行线程时启用和禁用按钮
【发布时间】:2021-12-25 09:38:47
【问题描述】:

在 web 应用程序 asp.net 中单击按钮,我创建了一个线程。在线程内部,我试图禁用按钮并执行一些后台作业。后台作业运行良好,但按钮禁用不起作用。 我的代码是:

private void generteBtn_Click(object sender, EventArgs e)
{
   new Thread (() =>
    {
       btn.enabled = false;
       // thread work start here;
       //emailing
    }.start();
     
}

我的问题是如何在线程工作时禁用按钮并在线程完成后重新启用generteBtn_Click。

【问题讨论】:

  • 您需要先了解工作中的 Asp.net,这对您有帮助。
  • 作为一般规则,在所有(如果不是大多数).NET UI 框架中,您不能在后台线程中操作或访问任何 UI 元素。

标签: c# asp.net multithreading


【解决方案1】:

因为你在这里创建的线程不是 UI 线程 并访问您可以使用的 UI 线程中的任何元素:

Application.Current.Dispatcher.Invoke(() =>
{
    btn.enabled = false;
});

有关更多详细信息,您可以查看以下链接:

1-How do I get the UI thread's Dispatcher?

2-Dispatcher.Dispatch on the UI thread

【讨论】:

  • 而且你应该使用Task而不是Thread
  • 我们在这里讨论的是网络应用程序,而不是 winforms 或 wpf :-)
  • 还是一样,这个线程无法访问其他线程对象,所以他需要使用dispatcher,或者他可以在线程开始工作之前更新action之外的按钮。
【解决方案2】:

在开始下一个进程/线程之前隐藏/显示按钮。

例如:

       btn.enabled = false;
      new Thread (() =>
      {
      // thread work start here;
      //emailing
      }.start();

这样,按钮被禁用,进程开始,就像往常一样,然后将一个全新的网页副本发送回客户端。

如果您需要更新该页面?那么你真的只有两个实际的选择。

您可以在页面上启动一个计时器 - 调用一个 ajax 例程,它必须检查进程设置的一些 session() 值 = "done"。

另一种方法是将 signalR 引入您的应用程序。

https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/introduction-to-signalr#:~:text=What%20is%20SignalR%3F%20ASP.NET%20SignalR%20is%20a%20library,process%20of%20adding%20real-time%20web%20functionality%20to%20applications.

我有许多处理例程。我开始这个过程,然后我在页面上启动一个计时器。它每 1 秒重新刷新一次更新面板,直到 session("MyProcessDone") = true,然后我在那个时候停止计时器(当然更新微调器/动画 gif)。因此,您可以在网页上启动一个计时器 - 并检查一些 session() 值,或者如前所述,将 signalR 引入您的应用程序。

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多