当前位置: 首页 > 知识库问答 >
问题:

是否可以在没有BackgroundWorker的情况下使WinForms响应?[闭门]

宦文柏
2023-03-14

我有一个在C#中使用WinForms制作的程序,它使用的是另一个开发人员提供的API,它必须在主线程中运行(因为它使用的是WM#消息,但可能还有其他原因),所以我不能使用BackgroundWorker。我的程序使用该API至少运行15分钟。因此,当我运行它并单击表单时,它将冻结并崩溃,因为它没有响应。我可以做些什么使表单响应,并且在使用该API时不触发Windows警报“应用程序未响应”?

以下是我在循环中为给定文件夹中的所有文件名运行的代码:

fApi.ApiSetDates(DateTime.MinValue, DateTime.MinValue, invoiceIssueDate.Year, invoiceIssueDate.Month);
try
    {
        if (fApi.ImportFakturFromXML(fileName) != 0)
        {
            throw new Exception(fApi.GetLastError());
        }
        File.Delete(fileName);
    }
    catch (Exception x)
    {
        MessageBox.Show(x.ToString());
    }

共有2个答案

谢奇略
2023-03-14

我要展示我通常做的事。

您将需要对UI控件的引用,然后在ThreadWG中运行您的代码。

private static void RunOnUiThread(Control c, Action action) 
{
     c.Invoke(new MethodInvoker(action));
}


private void ExecuteMyFunction()
{
     Task.Run(() => 
     {
          // run code in background...

          // run code in Main Thread (UI)
          // anyControl is a `Control` or a `Form`
          RunOnUiThread(anyControl, () => { /* code to run on mainthread */ });

          // run more code in background...
     }
 }
彭鸿哲
2023-03-14

下面是一个小Windows窗体的非设计器生成的代码,当单击它的单独按钮时,它在一个循环中执行许多长时间运行的UI线程阻塞操作。这段代码比我最初在评论中建议的计时器更具可读性和可维护性,并且比d.Kastier在他的答案评论中建议的要简单一些。

namespace LongRunningLoop
{
   public partial class Form1 : Form
   {
      private bool m_Closed = false;

      public Form1()
      {
         InitializeComponent(); // set up button1
      }

      // async void event handler.  Usually async void
      // is a no-no, but here we really do want to fire and forget.
      // We prevent nasty things from happening by disabling the UI
      // before starting the main work and exiting if we detect
      // that the form has been closed.
      private async void button1_Click(object sender, EventArgs e)
      {
         // Disable the UI so there's no reentrancy during the Task.Delay()
         button1.Enabled = false;
         for (int i = 0; i < 60; i++)
         {
            if (m_Closed)
            {
               // Don't keep doing work if the user has closed the form
               break;
            }
            Thread.Sleep(5000); // A long-running, blocking call (sleep thread for 5 seconds)
            await Task.Delay(100); // Yield to allow other events to be processed
         }
         // Re-enable the UI
         button1.Enabled = true;
      }

      private void Form1_FormClosed(object sender, FormClosedEventArgs e)
      {
         // Set a flag to signal the loop to exit
         m_Closed = true;
      }
   }
}
 类似资料:
  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误

  • 我想使用并使其直接进入给定的url,而不是从ribbon配置中获取主机。 我知道在Spring,cloud-feign默认与ribbon和eureka一起出现。 根据这个:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#spring-cloud-ribbon-without-eure

  • 在Spring Boot的文档中,我只找到了使用Redis会话的例子,不使用Redis也能使用它吗?

  • 我有一个使用gRPC的服务器,在反应客户端上,我正在使用grpcwebagent的grpc网络,我一直在尝试将我的客户端连接到服务器,但不断得到错误代码2,消息为:响应关闭,没有标头。其他人遇到过这个问题吗?我目前正在使用grpc-web的不可能-eng实现。

  • 我已经从源代码处构建并安装了另一个glibc,并且我想让现有的用C++编写的可执行文件与自定义glibc一起运行,以供实验之用。为了做到这一点,我尝试更改可执行文件的加载程序。首先,在/lib64下创建了一个名为的链接,其路径指向新的加载程序 其次,通过文本编辑器修改了可执行文件中的加载器路径,将“/lib64/ld-linux-x86-64.so.2”更改为“/lib64/ld_linux-x8

  • 我正在试验OSGi条件权限机制。更具体地说,我试图使用org.osgi.service.condpermadmin.BundleSignerCondition来限制哪些包可以启动。我所拥有的文档指出,为了使用该权限,我必须使用org.osgi.framework.trust.repositories框架配置属性指定到JKS密钥库的路径。但是,同一文档提到该属性中提到的JKS不能有密码。所以问题是:

  • 问题内容: 我正在尝试创建一个与SurveyMonkey API交互的基于Java的本地客户端。 SurveyMonkey需要使用OAuth 2.0的长期访问令牌,我对此不太熟悉。 我已经搜索了几个小时,但我认为答案是否定的,但我只想确定一下: 我是否可以编写一个与SurveyMonkey交互的简单Java客户端, 而无需在某些云中设置自己的重定向服务器 ? 我觉得必须拥有自己的在线服务才能接收O

  • 问题内容: 有关一些背景知识和参考,以下是一些Heroku文档页面的一些报价。 从Heroku Node.js支持>激活中: 当应用程序的根目录中有文件时,将使用Heroku Node.js buildpack 。 从Heroku Node.js支持>默认Web进程类型: 首先,Heroku寻找一个Procfile来指定您的进程类型。 如果在构建过程中应用程序的根目录中没有任何内容,则将通过运行[