在 C# 中,我可以启动后台操作,终止它并获取它的堆栈跟踪吗?
In C#, can I start a background operation, kill it and get its stack trace?
在我的 C# 应用程序(实际上是单元测试)中,我希望能够启动操作并设置超时。如果超时时间过去但我的操作还没有终止,我想:
- 抛出异常。
- 包括线程的堆栈跟踪运行操作。
- 如果方便的话,取消操作。
我可以使用 Lawrence Johnston 在这个答案中描述的方法完成第 1 点:
我怎样才能完成第 2 点?我有一个任务的引用,但我知道任务对象本身没有堆栈跟踪。任务只是某种数据结构。只有线程有堆栈跟踪。但是有什么方法可以从线程 运行 任务中获取堆栈跟踪,如果有的话?或者我是否需要完全重写我的任务主体才能使这成为可能?
第 3 点是可选的。让任务在后台不等待地继续是可以接受的,但是中止它会很好。
使用取消令牌。它会做你想要的所有 3 件事:
- 当任务被取消时,它们抛出
TaskCancelledException
。
- 异常会有堆栈跟踪。
- 任务将被取消。
您可以阅读它 here,但这里有一个简单的例子:
var tokenSource = new CancellationTokenSource();
//start a task
var task = Task.Delay(TimeSpan.FromMinutes(1), tokenSource.Token);
//cancel the task
tokenSource.Cancel();
try {
//once you await it, you will see the exception
await task;
} catch (TaskCanceledException e) {
//inspect e.StackTrace
}
在我的 C# 应用程序(实际上是单元测试)中,我希望能够启动操作并设置超时。如果超时时间过去但我的操作还没有终止,我想:
- 抛出异常。
- 包括线程的堆栈跟踪运行操作。
- 如果方便的话,取消操作。
我可以使用 Lawrence Johnston 在这个答案中描述的方法完成第 1 点:
我怎样才能完成第 2 点?我有一个任务的引用,但我知道任务对象本身没有堆栈跟踪。任务只是某种数据结构。只有线程有堆栈跟踪。但是有什么方法可以从线程 运行 任务中获取堆栈跟踪,如果有的话?或者我是否需要完全重写我的任务主体才能使这成为可能?
第 3 点是可选的。让任务在后台不等待地继续是可以接受的,但是中止它会很好。
使用取消令牌。它会做你想要的所有 3 件事:
- 当任务被取消时,它们抛出
TaskCancelledException
。 - 异常会有堆栈跟踪。
- 任务将被取消。
您可以阅读它 here,但这里有一个简单的例子:
var tokenSource = new CancellationTokenSource();
//start a task
var task = Task.Delay(TimeSpan.FromMinutes(1), tokenSource.Token);
//cancel the task
tokenSource.Cancel();
try {
//once you await it, you will see the exception
await task;
} catch (TaskCanceledException e) {
//inspect e.StackTrace
}