作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很熟悉在一个线程中抛出的异常通常无法在另一个线程中捕获的事实。我如何将错误转移到主线程?
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/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!