线程中的异常处理,联系WCF服务

时间:2014-03-20 07:38:55

标签: c# .net multithreading wcf

我对线程中的异常处理有疑问。我有一个简单的WCF服务,它需要一些字节作为输入。从控制台应用程序调用此WCF服务。

方法代码段(MyMethod)

try 
{
   _service.ImportBytes(bytes);
   _service.Close();

}
catch(Exception e) 
{
   _logger.Error(e.Message);
   _service.Abort();
}

如果这是直接从主线程调用的方法,则会发生异常,因为我的服务被取消(在IIS中停止了应用程序)。

但如果从一个线程调用它,则异常永远不会发生:

 var thread = new Thread(() => MyMethod(file);
 thread.Start()

由于应该多次调用此方法,因此在foreach loop中我发现如果我为每个文件创建一个线程。如果一个线程失败,它应该只记录它并死掉,所以它不会中断应用程序本身。

我应该如何处理线程内的异常?

1 个答案:

答案 0 :(得分:4)

在.NET 4.0中添加了任务并行库(TPL)。这是使用线程的首选方法。

Task是一个对象,它封装了一个将在某个时刻或异常返回值的操作。

基本思想是你做这样的事情:

Task.Run(() => { /* your code */ });

这将返回一个Task对象,该对象在内部代码完成时结束。您可以在这样的Task对象上安排延续,以便在发生这种情况时运行。但是,由于您正在执行WCF服务调用,因此您可以让Visual Studio为您生成异步方法,从而使您的生活更轻松。特别是因为WCF方法是异步I / O的一种形式,你可以使用它们而不必自己将它们包装在一个线程中。

这意味着所有方法都以postfix'Async'结尾并返回Task对象。通过使用async和await,您可以轻松地使用它们。通过使用Task.WhenAll,您可以让多个任务并行运行。 Task.WhenAll将返回Task状态的Faulted,其中包含当出现问题时由您的某个任务抛出的所有异常。

以下是使用异步的some documentation并等待可以帮助您入门的WCF服务。