【问题标题】:Exception handling in threads, contacting a WCF service线程中的异常处理,联系 WCF 服务
【发布时间】:2014-03-20 07:38:54
【问题描述】:

我对线程中的异常处理有疑问。我有一个简单的 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 中我发现如果我为每个文件创建一个线程。如果一个线程失败,它应该只是记录它并死掉,所以它不会中断应用程序本身。

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

【问题讨论】:

    标签: c# .net multithreading wcf


    【解决方案1】:

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

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

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

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

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

    这意味着您的所有方法都以后缀“异步”结尾并返回一个任务对象。通过使用 async 和 await 你可以很容易地使用这些。通过使用Task.WhenAll,您可以让多个任务并行运行。 Task.WhenAll 将在 Faulted 状态下返回 Task,但出现问题时您的任务之一抛出的所有异常除外。

    这里是 some documentation 关于使用异步和等待 WCF 服务的内容,应该可以帮助您入门。

    【讨论】:

    • 这是正确的。以这种方式管理异步工作会减少它通常附带的绘制。我也更喜欢使用Task。作为替代方案,您还应该查看额外的 TPL 和/或 Reactive 扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多