从工作线程抛出FaultException <t>会导致WCF崩溃</t>

时间:2009-10-29 11:30:16

标签: wcf multithreading

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

任何解决方案???

示例:

var thread = new Thread(new ThreadStart(
                delegate
                {
                    new Killbot().KillAllHumans(); // Throws a FaultException
                }));

2 个答案:

答案 0 :(得分:0)

最简单的方法是将调用包装在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结合使用。

答案 1 :(得分:0)

我个人不打扰WCF服务中的后台线程。无论如何,服务实际上是一个“后台工作者”。您需要做的就是确保您在服务中进行的任何阻止调用都不会影响其他客户端。您可以通过更改并发模式来执行此操作:

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

设置完成后,WCF将在多个线程上调用您的服务方法,而不尝试同步它们。只要您编写代码并考虑到这一点,就可以进行所需的所有阻塞调用。