gpt4 book ai didi

c# - 如何将异常显式传递给 C# 中的主线程

转载 作者:太空狗 更新时间:2023-10-29 18:13:43 25 4
gpt4 key购买 nike

我很熟悉在一个线程中抛出的异常通常无法在另一个线程中捕获的事实。我如何将错误转移到主线程?

public static void Main()
{
new Thread (Go).Start();
}

static void Go()
{
try
{
// ...
throw null; // The NullReferenceException will get caught below
// ...
}
catch (Exception ex)
{
// Typically log the exception, and/or signal another thread
// that we've come unstuck
// ...
}
}

最佳答案

如果您使用的是 .NET 4,则可以通过 Tasks 实现更好的方法,但假设您需要使用 Threads...

如果您的示例是控制台应用程序,那么您的 Main 方法可能会在 Go 开始执行之前退出。所以抛出异常时你的“主线程”可能不存在。要停止这种情况,您需要一些同步。

应该这样做:

static Exception _ThreadException = null;

public static void Main()
{
var t = new Thread ( Go );
t.Start();

// this blocks this thread until the worker thread completes
t.Join();

// now see if there was an exception
if ( _ThreadException != null ) HandleException( _ThreadException );
}

static void HandleException( Exception ex )
{
// this will be run on the main thread
}

static void Go()
{
try
{
// ...
throw null; // The NullReferenceException will get caught below
// ...
}
catch (Exception ex)
{
_ThreadException = ex;
}
}

如果这是一个 UI 应用程序,事情就会简单一些。您需要将一些对 UI 线程的引用传递给 Go 方法,以便它知道将异常发送到哪里。执行此操作的最佳方法是传递 UI 线程的 SynchronizationContext

像这样的东西会起作用:

public static void Main()
{
var ui = SynchronizationContext.Current;
new Thread ( () => Go( ui ) ).Start();
}

static void HandleException( Exception ex )
{
// this will be run on the UI thread
}

static void Go( SynchronizationContext ui )
{
try
{
// ...
throw null; // The NullReferenceException will get caught below
// ...
}
catch (Exception ex)
{
ui.Send( state => HandleException( ex ), null );
}
}

关于c# - 如何将异常显式传递给 C# 中的主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776865/

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