代码之家  ›  专栏  ›  技术社区  ›  Horst Walter

C#WinForms应用程序:停止/中断Windows窗体应用程序

  •  2
  • Horst Walter  · 技术社区  · 14 年前

    环境:.net 3.5 WinForms应用程序

    我正在寻找一些如何停止/中断Windows窗体应用程序的方法,例如,当某些操作花费的时间太长时。

    1. 正常的事件没有足够的响应,因为后端调用以某种方式消耗了太多时间,所以它们没有及时做出响应。
    2. 在我的read方法中,我添加了显式检查,但是我不能在第三方框架中添加这样的检查。而且,这不是一个很好的方法。

    也许有人知道如何可靠和及时地停止一些正在运行的方法。有什么可以打断的吗?

    问候HW

    4 回复  |  直到 14 年前
        1
  •  4
  •   Hans Passant    14 年前

    正常的事件没有足够的响应,因为后端调用不知何故占用了这么多时间

    不是这样的。理解“消息循环”是非常重要的,一定要仔细阅读。简而言之,Windows只能告诉你的程序,当程序的主线程空闲时,一个按钮被点击了。你的主线程应该总是空闲的,准备好在需要做一些工作的时候开始工作。比如画你的窗体或者处理击键。或者在用户单击“取消”按钮时执行某些操作。

    也就是说需要做些其他的事情。一根线。到目前为止,在线程的麻烦世界中开始的最好方法是BackgroundWorker类。它有一个CancelAsync()方法,显式地设计为做您想做的事情。请务必查看MSDN库文章中提供的有关此方法的代码示例。

        2
  •  2
  •   Jesper Palm    14 年前

    Thread thread;
    void StartLong()
    {
      thread = new Thread(SomeMethod);
      thread.Start();
    }
    
    void SomeMethod()
    {
      //Long running code here.
    }
    
    void CancelButton_Click(object sender, EventArgs e)
    {
      //...
      thread.Abort();
    }
    

    如果您无法控制执行时间很长的代码。你所能做的就是中止线程。 thread.Abort();

        3
  •  2
  •   Zotta    14 年前

    您应该在不同的线程中执行“long”=所有超过1/5秒的操作。 最好的方法是给一个操作某种类型的“上下文”加上一个变量,告诉workerthread用户是否要缩写这个操作。

        4
  •  2
  •   Matt    14 年前

    您可以考虑使用BackgroundWorker类,它将直接与线程一起工作抽象出来,因此实现起来更容易一些。您只需创建BackgroundWorker的一个实例并将一些事件处理程序附加到它。 Here is an example

    推荐文章