【问题标题】:Can I write a general purpose method to call other methods with a timeout?我可以编写一个通用方法来调用其他超时方法吗?
【发布时间】:2009-09-23 21:17:07
【问题描述】:

我有一个许多人肯定熟悉的问题:我正在拨打电话(具体来说是 Forest.GetCurrentForest()),在某些情况下,它会无法工作并引发异常。不是什么大问题,只要抓住它并妥善处理即可。但是,调用失败时非常慢;完全完成需要 30 秒。

我一直在寻找一种调用该方法的方法,但设置了一个超时,以便我们可以在更短的时间后停止。我发现了一个有趣的建议here,但如果我能解决的话,我想要一个更通用的解决方案。该解决方案在额外方面也相当繁重,只是为了获得超时。我希望它会像说的那样简单

CallMethodWithTimeout(Delegate method, int timeout)

但我不确定这样的事情是否会奏效。关于做类似事情的任何建议,还是在 C# 中是不可能的?我们也被困在使用 .NET 2.0 上。

除此之外,我将让 cmets 保持 GetCurrentForest() 调用不会花费 30 秒来确定它没有发生。虽然我想知道通用方法调用方法的可行性。

【问题讨论】:

  • 无论你做什么,请不要使用Thread.AbortThread.Interrupt。 :)
  • 会的。或者不要……对。 ;) 谢谢大家的回复。我想我们现在可能已经解决了这个问题,但如果将来出现问题,我很高兴收到建议。

标签: c# asp.net .net-2.0 delegates timeout


【解决方案1】:

我想了想,想出了以下方法(本质上是迈克尔在编写代码时所写内容的实现):

private static bool TimedMethodCaller(Delegate dlgt, int timeout, 
    params object[] args)
{
    ManualResetEvent waitHandle = new ManualResetEvent(false);
    Thread t = new Thread(new ThreadStart(delegate
        {
            dlgt.Method.Invoke(dlgt.Target, args);
            waitHandle.Set();
        }));
    t.Start();
    return waitHandle.WaitOne(timeout);
}

使用此方法,您可以发布您喜欢的任何委托和参数。它确实有一个缺点,它不处理返回值(但也可以通过某种方式实现)。

你可以这样称呼它:

// parameter-less method call
bool success = TimedMethodCaller(new Action(ParamlessTestMethod), 100);

如果你想调用一个带参数的方法,你需要一个合适的委托:

// call with one parameter (using the Action<T> delegate of the framework
bool success = TimedMethodCaller(new Action<int>(TestMethod), 100, "text"); 

// call with several parameters using custom delegate that is defined like this:
// public delegate void SampleDelegate(string text, int numeric);
bool success = TimedMethodCaller(new SampleDelegate(TestMethod), 100, "text", 1);

【讨论】:

    【解决方案2】:

    您不能直接将不可取消的操作设为可取消(this link 描述了代码中的一些异步异常问题,这些问题尚未针对它进行强化。)

    我见过的一种模式是将工作排队到另一个线程,但只等待有限的时间完成,当需要太长时间时有效地放弃请求。这不会完全取消,但它可以帮助您的应用程序保持响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 2018-03-27
      • 1970-01-01
      • 2018-02-04
      • 2017-07-15
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多