当一个线程异常时,有没有办法避免线程池崩溃?

时间:2018-03-16 09:12:29

标签: c# .net multithreading

.NET框架的这个问题。在调用方法中放置一个try / catch块是这个问题的解决方案,但我想在上层处理它。对此有什么解决方案吗?

3 个答案:

答案 0 :(得分:0)

没有。基本上,不要让异常达到堆栈顶部。如初。

答案 1 :(得分:0)

你可以在上层处理,但你仍然需要在调用中放置try catch。但是,不是在catch中处理异常 - 而是将异常添加到ConcurrentQueue中,然后在调用之外,您可以抛出AggregateException,其中List<Exception>已在整个队列中排队执行多线程代码。

以下是使用Parallel.ForEach https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-handle-exceptions-in-parallel-loops

时如何实施的示例

答案 2 :(得分:0)

您可以使用asynchronous delegate。当您致电> Message Stream created and running ksql> Exception in thread > "ksql_query_CSAS_DEAL_EXPENSE_NEW-01b2596a-3d2a-4d41-a823-0e345ec727fa-StreamThread-115" > java.lang.NullPointerException at > io.confluent.ksql.structured.SchemaKStream.lambda$selectKey$3(SchemaKStream.java:248) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:159) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:156) > at > org.apache.kafka.streams.kstream.internals.KStreamMap$KStreamMapProcessor.process(KStreamMap.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamTransformValues$KStreamTransformValuesProcessor.process(KStreamTransformValues.java:169) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamMapValues$KStreamMapProcessor.process(KStreamMapValues.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:80) > at > org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:221) > at > org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:94) > at > org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:422) > at > org.apache.kafka.streams.processor.internals.StreamThread.processAndMaybeCommit(StreamThread.java:924) > at > org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:804) > at > org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:756) > at > org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:726) > Exception in thread > "ksql_query_CSAS_DEAL_EXPENSE_NEW-01b2596a-3d2a-4d41-a823-0e345ec727fa-StreamThread-116" > java.lang.NullPointerException at > io.confluent.ksql.structured.SchemaKStream.lambda$selectKey$3(SchemaKStream.java:248) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:159) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:156) > at > org.apache.kafka.streams.kstream.internals.KStreamMap$KStreamMapProcessor.process(KStreamMap.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamTransformValues$KStreamTransformValuesProcessor.process(KStreamTransformValues.java:169) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamMapValues$KStreamMapProcessor.process(KStreamMapValues.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:80) > at > org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:221) > at > org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:94) > at > org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:422) > at > org.apache.kafka.streams.processor.internals.StreamThread.processAndMaybeCommit(StreamThread.java:924) > at > org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:804) > at > org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:756) > at > org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:726) > Exception in thread > "ksql_query_CSAS_DEAL_EXPENSE_NEW-01b2596a-3d2a-4d41-a823-0e345ec727fa-StreamThread-113" > java.lang.NullPointerException at > io.confluent.ksql.structured.SchemaKStream.lambda$selectKey$3(SchemaKStream.java:248) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:159) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:156) > at > org.apache.kafka.streams.kstream.internals.KStreamMap$KStreamMapProcessor.process(KStreamMap.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamTransformValues$KStreamTransformValuesProcessor.process(KStreamTransformValues.java:169) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamMapValues$KStreamMapProcessor.process(KStreamMapValues.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:80) > at > org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:221) > at > org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:94) > at > org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:422) > at > org.apache.kafka.streams.processor.internals.StreamThread.processAndMaybeCommit(StreamThread.java:924) > at > org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:804) > at > org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:756) > at > org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:726) > Exception in thread > "ksql_query_CSAS_DEAL_EXPENSE_NEW-01b2596a-3d2a-4d41-a823-0e345ec727fa-StreamThread-114" > java.lang.NullPointerException at > io.confluent.ksql.structured.SchemaKStream.lambda$selectKey$3(SchemaKStream.java:248) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:159) > at > org.apache.kafka.streams.kstream.internals.KStreamImpl$2.apply(KStreamImpl.java:156) > at > org.apache.kafka.streams.kstream.internals.KStreamMap$KStreamMapProcessor.process(KStreamMap.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamTransformValues$KStreamTransformValuesProcessor.process(KStreamTransformValues.java:169) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.kstream.internals.KStreamMapValues$KStreamMapProcessor.process(KStreamMapValues.java:41) > at > org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46) > at > org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208) > at > org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124) > at > org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174) > at > org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:80) > at > org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:221) > at > org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:94) > at > org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:422) > at > org.apache.kafka.streams.processor.internals.StreamThread.processAndMaybeCommit(StreamThread.java:924) > at > org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:804) > at > org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:756) > at > org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:726) 时,主线程中将抛出未在工作线程中捕获的任何异常。

EndInvoke()

输出:

public class Program
{
    public static void DoParallelStuff(string caller)
    {
        for (var i = 1; i<5; i++)
        { 
            Console.WriteLine("I'm doing stuff for {0} on thread {1}....{2}", caller, Thread.CurrentThread.ManagedThreadId, i); 
            Thread.Sleep(100); 
        }
    }

    public static void Background()
    {
        DoParallelStuff("Background");
        Console.WriteLine("Background will now throw an exception.");
        var a = ((string)null).ToString();
    }

    public static void Main()
    {
        try
        {
            Action background = Background;
            var result = background.BeginInvoke(null, null);
            DoParallelStuff("Foreground");
            background.EndInvoke(result);
        }
        catch(System.Exception exception)
        {
            Console.WriteLine("This was caught in the main thread: '{0}'", exception.Message);
        }

    }
}

Try it on DotNetFiddle