gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:19 25 4
gpt4 key购买 nike

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

方法片段(我的方法)

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 循环 中,我发现如果我为每个文件创建一个线程。如果一个线程失败,它应该记录下来然后死掉,这样它就不会中断应用程序本身。

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

最佳答案

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

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

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

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

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

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

这里是 some documentation关于使用异步和等待应该让你开始的 WCF 服务。

关于c# - 线程中的异常处理,联系 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22526406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com