【问题标题】:pause executed thread and then re-use same thread暂停执行的线程,然后重新使用同一个线程
【发布时间】:2020-09-21 06:55:41
【问题描述】:

我用的是winform,vs2012
流程:用户选择一个文件,我在那个文件上做一些工作,然后用户选择另一个文件,我在另一个文件上做一些工作

我想要的是:(是否可以使用线程、后台工作程序或任何其他东西来完成并不重要)
在处理第一个文件时显示“使用动画图片框处理表单
在处理第二个文件时显示“使用动画图片框处理表单
工作完成后,关闭“处理”表单(以线程开头)

这里用户将使用 openfiledialog 选择一个文件

Private Sub btn_first_file_Click(sender As Object, e As EventArgs) Handles btn_first_file.Click
        If (some logic)
             'do the process on file (time consuming code)
             'open "processing" form with new thread (with only animated picturebox)
             'when task done, close/hide the "processing" form
        End If  

Private Sub btn_second_file_Click(sender As Object, e As EventArgs) Handles btn_second_file.Click
        If (some logic)
             'do the process on file (time consuming code)
             'open "processing" form with new thread (with only animated picturebox)
             'when task done, close the "processing" form
        End If           
    End Sub

我尝试过的:
执行上面的逻辑,但是我在工作完成后使用thread.abort,后来发现使用abort函数不好。
case-1:如果我中止线程
如果用户返回并选择另一个文件(使用 openfiledialog),则上述代码块中的线程将不会重新启动(并且处理表单将不会打开)
案例 2:如果我不中止线程
如果用户返回 5 次,则“处理表单”打开 5 次(线程的 5 个实例)

我尝试了与 backgroundworker 相同的逻辑,但问题是 gif 无法在图片框上正确加载(图片框正在处理表单-从新线程开始)
以及如何关闭用线程打开的处理表单,因为如果我中止线程,“处理”表单不会关闭。

【问题讨论】:

  • 为什么不直接要求用户在进程开始时选择两个文件,在 BackgroundWorker 中完成所有工作,并定期进行 ProgressChanged 以对图片框中的动画进行一些有意义的更改?跨度>
  • 小心混合windows控件和线程;控件只能由创建它的同一线程可靠地访问。如果您只是盲目地更新动画,而不是让动画成为某种自定义进度条,只需使用计时器来更新动画,并异步执行工作,这样您就不会阻塞 UI 线程(并且只有一个 UI 线程)
  • (1) 只有在选择了第一个文件后,进一步的处理才能继续 (2) 第一个文件只是图像文件,第二个文件是数据文件,如 txt、img、视频、rar 等,第二个文件可以只有 1-2 mb 或 200-300 mb (3) 我没有更新进度,我只是在另一个 winform 上显示带有动画 gif 的图片框,同时在 UI 线程上执行一些耗时的代码。
  • 我不确定它回答了为什么用户不能在开始时选择两个文件,但是好的,这不是那么重要.. 你的方法最大的问题是 虽然一些耗时的代码正在 UI 线程上执行 - Windows 窗体的主要罪过
  • 耗时代码正在创建用户选择文件的 rar 文件(最高可达 gb),我无法理解“Windows Forms 大罪”

标签: vb.net multithreading


【解决方案1】:

您可以轻松地将 BackgroundWorker 或 Task Async 模式用于您正在做的事情;

  • 将此表单的实例保存在执行长进程的主类中的类级别变量中。在流程开始时(在按钮单击处理程序中)显示此表单(而不是对话框)
  • 在后台worker的dowork事件中运行进程,并让runworkercompleted事件隐藏动画表单,或者让你的长进程TAP(异步)兼容并等待它,等待完成后关闭表单

【讨论】:

  • 谢谢先生,我试着和你在这里描述的一样(但我的逻辑有点模糊),但你的解释让我很开心,真的很有帮助,再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多