Бросая FaultException <T>из рабочего потока, происходит сбой WCF - PullRequest
0 голосов
/ 29 октября 2009

Я обнаружил, что если вы сгенерируете исключение FaultException из нового рабочего потока, оно не просачивается к клиенту, а просто вызывает сбой WCF.

Любые решения ???

пример:

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

Ответы [ 2 ]

0 голосов
/ 29 октября 2009

Лично я не стал бы беспокоиться о фоновых потоках в службе WCF. Сервис в любом случае фактически является «фоновым работником». Все, что вам нужно сделать, это убедиться, что любые блокирующие звонки, которые вы делаете внутри службы, не влияют на других клиентов. Вы можете сделать это, изменив режим параллелизма:

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

Когда это установлено, WCF будет вызывать ваши сервисные методы в нескольких потоках, не пытаясь их синхронизировать. Пока вы пишете свой код, помня об этом, вы можете выполнять все блокирующие вызовы, какие хотите.

0 голосов
/ 29 октября 2009

Самый простой способ - заключить вызов в блок 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());
                }
            }));

Если вы хотите обработать исключение в вашем основном потоке, вам придется использовать BeginInvoke и EndInvoke в сочетании с AsyncCallback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...