【发布时间】:2022-01-18 17:25:19
【问题描述】:
我有一个在 C# 中使用 WinForms 制作的程序,它使用了另一个开发人员提供的 API,它必须在主线程中运行(因为它使用的是 WM_Messages,但也可能有其他原因) - 所以我可以不要使用 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());
}
【问题讨论】:
-
邮政编码显示您实际在做什么、您正在调用什么样的函数以及这些函数的用途说明。
-
这里没有太多背景信息,但请注意,即使您调用 API 函数仍然可以向您的主窗口发布或发送消息(我假设您在某个时候将句柄传递给它)它来自后台线程。
-
你是说一次调用其他开发人员的代码可能需要 15 分钟?
-
@TK-421 在这种情况下,您有机会从自己的代码中获得收益。我建议设置一个间隔为 0 的计时器并在每个 Tick 上运行一次迭代。这至少可以让你每 30 秒到 1 分钟刷新一次 UI。
-
隐藏问题的一种基本方法是隐藏窗口,当工作完成时使用 NotifyIcon 提醒用户。另一种方法是创建一个对此类库友好的工作线程,example。