【问题标题】:Throwing FaultException<T> from worker thread crashes WCF从工作线程抛出 FaultException<T> 会使 WCF 崩溃
【发布时间】:2009-10-29 11:30:15
【问题描述】:

我发现如果你从一个新的工作线程抛出一个 FaultException,它不会渗透到客户端,而只会导致 WCF 崩溃。

有什么解决办法???

示例:

var thread = new Thread(new ThreadStart( 代表 { 新的 Killbot().KillAllHumans(); // 抛出一个故障异常 }));

【问题讨论】:

  • 这个问题其实没有解决办法,WCF只会从主线程冒泡faultExceptions

标签: wcf multithreading


【解决方案1】:

最简单的方法是将调用包装在 try-catch 块中并记录异常:

var thread = new Thread(new ThreadStart(
            delegate
            {
                try
                {
                    new Killbot().KillAllHumans(); // Throws a FaultException
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(ex.ToString());
                }
            }));

如果您想在主线程中处理异常,您必须将BeginInvokeEndInvokeAsyncCallback 结合使用。

【讨论】:

    【解决方案2】:

    我个人不会为 WCF 服务中的后台线程而烦恼。无论如何,服务实际上是“后台工作人员”。您需要做的就是确保您在服务内进行的任何阻塞调用都不会影响其他客户端。您可以通过更改并发模式来做到这一点:

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    class MyServiceClass : IMyServiceContract {
        public void KillAll() {
            new Killbot().KillAllHumans(); // Throws a FaultException
        }
    }
    

    设置后,WCF 将在多个线程上调用您的服务方法,而不会尝试同步它们。只要您牢记这一点编写代码,您就可以执行所有您想要的阻塞调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多