【问题标题】:increase Thread time out .NET增加线程超时.NET
【发布时间】:2015-02-11 08:50:10
【问题描述】:

我有一个 WCF 方法,可以进行一些计算和插入。此方法在线程中调用。我的方法需要超过 45 分钟(这对我来说很好),但之后它会抛出一个错误,提示“'超时已过期。在操作完成之前超时时间已过或服务器没有响应”。 只有插入部分在事务范围内,在分析器中我可以看到插入只发生了不到一分钟。我想这是超时的线程。如何增加超时?请帮忙

谢谢 兰吉特

【问题讨论】:

  • 您的 WCF 方法需要 45 分钟才能响应?
  • 这个线程做任何与 SQL 相关的工作吗?也许您可以包含引发异常的代码?
  • 您可能应该将应用程序拆分为两部分:Windows 服务和 WCF 服务(或在 win 服务中托管 WCF 服务)。原因是应用程序池可以随时回收,从而在工作完成之前中止工作。在 Windows 服务中执行此操作更加稳定。
  • 同意@jgauffin:WCF(和一般的 Web 应用程序)不打算处理超过 45 分钟的请求!你应该做一个服务,或者一个后台任务(预定的exe)。
  • 其实是我想实现的一个call and forget逻辑。前端调用 WCF,WCF 调用线程开始的业务层。这是计算部分,因为它在一个循环中多次命中 DB,所以需要将近 40 分钟。开始交易后 35 秒超时。

标签: .net multithreading wcf


【解决方案1】:

我在一个项目中使用了一个很容易解决的问题。

我们没有您的代码,所以可以猜测,但如果您不急于从 WCF 服务器部分获得响应,您实际上可以在消息处理程序中对计算部分进行子线程处理,并且当您'准备好了 - 异步 - 以某种方式响应您的客户。这样,您的消息处理程序可以立即响应您的客户端请求,并且不会发生线程超时。

但是,这意味着您可能必须更改客户端/服务器的工作方式,例如在计算完成后定期让客户端请求服务器。

要在您的客户端通道处理程序中进行简单的子线程处理,您可以这样做:

public MyObject payload = null;

// Called to initiate the computation on the channel
public bool StartComputation(MyParamClass param)
{
    // Reset payload to make sure 'IsComputationDone()' returns 'not ready' 
    payload = null;

    // Start thread where computation is done
    ThreadPool.QueueUserWorkItem(o => {

        // Do computation with param
        // Payload is set when computation is done
        payload = doStuff(param);
    }

    return true;
}

// Called regularly to know if computation is ready
public bool IsComputationDone()
{
    return payload != null;
}

// Finally get payload
public MyObject GetResult()
{
    return IsComputationDone() ? payload : null;
}

就是这样。之后,您可能想要添加检查,以确保您不能使用同一通道一次运行两个计算,或者至少管理一个计算队列。由你决定,但这代表基本方法

【讨论】:

  • 虽然这在理论上可能是好的。在实践中,这可能会导致各种问题(尤其是在您运行 IIS 时)。如果它在 IIS 中,则 ThreadPool 调用将被 IIS 终止。这也许是时候认识到问题的本质,即工作流/消息队列。
  • 在这种情况下 IIS 确实是个麻烦,但在涉及 IIS 的问题中没有具体说明。但是,如果需要 IIS,您仍然可以将计算部分委托给外部经典应用程序。
  • 感谢您的回复。创建线程的代码如下: "Dim OrdersThread As New System.Threading.Thread(AddressOf CreateOrders) OrdersThread.Start()" CreateOrders 是具有计算和插入的方法。我并不真正关心结果,因为一旦处理完成,客户端就不会显示任何内容。我已经配置了一封邮件,一旦完成就会发送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2019-04-08
  • 2015-04-28
相关资源
最近更新 更多