【问题标题】:Can I interrupt a method while this method is working?我可以在该方法工作时中断该方法吗?
【发布时间】:2014-08-22 11:13:39
【问题描述】:

我们可以在方法工作时中断它吗?因为我有一个线程中的方法,我必须在单击按钮时中断该方法。我怎样才能做到这一点?

我尝试了 Abort() 方法,但它不起作用。因为 Abort() 是一种没有任何担保行为的方法。我的意思是如果我们使用该方法,我们不确定方法终止。

我只有一个像 DoSomething() 这样的方法名称,因为我使用的是用 C++ 编写的 DLL。因此我没有方法的源代码。如果我点击一个按钮,这个方法必须终止

请给我一些建议。

【问题讨论】:

标签: c# multithreading events interrupt terminate


【解决方案1】:

如果您有权访问该方法,请实现一个标志以中止它并编写代码解决问题。这是我要做的概念性伪 C# 示例:

private bool aborted = false;

public ResultClass Method()
{
    for (i = 0; i < int.MaxValue && !aborted; i++)
    {
      // ...
    }

    if (aborted)
    {
        return null;
    }

    return new ResultClass(...);
}

public void Abort()
{
    aborted = true;
}

这可能看起来像很多代码,但它更干净,您可以根据需要清理和处理内容。相反,中止线程是一件麻烦事,并且只能在线程达到WaitSleepJoin 状态时发生。

如果你真的需要中止,至少做这样的事情:

try {
    // abortable code
}
finally
{
    // clean-up resources
}

【讨论】:

  • 如果我使用此代码,我无法逃脱方法。这个方法可以代替 Abort() 方法使用。我说的对吗?
  • 我只有一个像 DoSomething() 这样的方法名。如果我点击一个按钮,这个方法必须终止
  • 最好使用ManualResetEvent 或类似的方式来执行此操作,或者使用Interlocked.Exchange/Interlocked.Read
  • 是的,它可能会更好,但在涉及多线程时必须考虑到性能和可读性/可维护性,因此解决方案简单或复杂完全取决于许多因素如何最好地解决此类问题一个问题。
【解决方案2】:

您可以在线程而不是方法上使用 Abort。如果要中断方法,请使用 return。

【讨论】:

  • return 可以在方法内部使用。你怎么能从方法之外做到这一点?
【解决方案3】:

我已经解决了这个问题。如果有人有这样的问题,也许它可以在下面的页面中找到答案

我在下面的链接中得到了一些关于我的问题的信息

Abort call to unmanaged DLL

我找到了一个关于我的解决方法的例子

Using kernel32 CreateThread/TerminateThread inside Azure Worker Role

你可以使用这个页面。这个页面包含很多关于 PInvoke 的代码部分。

http://www.pinvoke.net/

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多