【问题标题】:How to cancel a method from another thread如何取消另一个线程的方法
【发布时间】:2016-03-26 11:46:04
【问题描述】:

我在主线程中有一个方法,如果条件是@987654322,我希望从BackgroundWorker 中取消它(无论它是哪一行) @。类似处理

目前我必须定义一个私有 bool 并在我的方法中的每一行之前检查它。

private bool _cancelIt;

private void myLongRunningMethod()
{
  if(_cancelIt) return;
  //some code
  if(_cancelIt) return;
  //some code
  if(_cancelIt) return;
  //some code
  ...
}

有没有办法从另一个线程关闭该方法?类似的东西

myLongRunningMethod.Stop();

如果我必须在方法中的每一行之前检查条件,这不是一个好的代码

【问题讨论】:

  • 在它自己的线程中运行你的方法,并在你想杀死它时中止线程。除此之外我什么都想不出来。这样做的需要虽然到处都有不好的代码气味。这是什么“长时间运行方法”,为什么需要这样做?
  • @Ryios 我编辑了这个问题。该方法在主线程中。我想通过BackgroundWorker取消它
  • 你不能,你必须中止主线程,这会杀死应用程序。主线程应仅用于 GUI 操作。所有 DoWork 方法都应该在 win forms 应用程序的主线程之外。
  • @Ryios 我不想杀死主线程。这只是我在主线程中调用的一种方法。
  • 你想杀死这个方法。唯一的办法就是杀死它正在运行的线程。或者做你已经在做的事情。如果您不能杀死线程,那么可能需要进行重构,以便您可以杀死线程。例如。使该方法在一个线程中单独运行,然后杀死它。

标签: c# winforms methods


【解决方案1】:

一种解决方法是制作一个 DoWork llambda,它会监听取消。像这样的:

public void DoWork(Action work) {
    if (!canceled) {
        work();
    }
}


DoWork(() => {
   //do something if not cancelled
});

DoWork(() => {
  //do something else if not cancelled
});

【讨论】:

  • 这和你做的没什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多